프로그래밍 언어/C

C언어 28강) 공용체

happy_life 2020. 11. 16. 15:34

공용체

 

구조체는 멤버끼리 메모리 공간을 따로 쓰는 데, 공용체는 메모리 공간을 멤버끼리 같이 쓴다는 점에서 그 차이가 있다.

 

 

위의 논리적 그림에서 보듯 공용체는 가장 큰 자료형의 메모리 공간을 공유한다.

 

●공용체 선언문법

union 공용체이름 {
    자료형 멤버이름;
};

공용체는 구조체와 문법도 똑같고, 변수로 선언하는 것도 똑같다. 밑의 코드 예제를 보자.

 

●공용체 코드예제

#define _CRT_SECURE_NO_WARNINGS    // strcpy 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h>
#include <string.h>    // strcpy 함수가 선언된 헤더 파일

union Box {  // 공용체 정의
      
    short a;     // 2바이트
    float b;     // 4바이트
    char c[8];    // 8바이트
};

int main()
{
    union Box box;   // 공용체 변수 선언하기

    strcpy(box.c, "happy");    //문자열c에 happy 복사해 넣기

    printf("%d\n", sizeof(box));  // 8: 공용체의 전체 크기는 가장 큰 자료형의 크기

    
    printf("%f\n", box.b);  //297576637150958620000000000000.000000
    printf("%s\n", box.c);     // happy

    return 0;
}

결괏값

 

box.b의 값이 이상하게 나오는 이유: 

공용체는 메모리 크기를 공유하므로,  어느 한 멤버에만 값을 저장하면 다른 값은 사용할 수 없다. 

따라서 box.b의 값이 제대로 출력되게 하려면, box.b의 값도 따로 지정해주어야 한다.

 

box.b 지정 코드 예제

#define _CRT_SECURE_NO_WARNINGS    // strcpy 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h>
#include <string.h>    // strcpy 함수가 선언된 헤더 파일

union Box {  // 공용체 정의
      
    short a;     // 2바이트
    float b;     // 4바이트
    char c[8];    // 8바이트
};

int main()
{
    union Box box;   // 공용체 변수 선언하기

    strcpy(box.c, "happy");    //문자열c에 happy 복사해 넣기
    box.b = 15;
    printf("%d\n", sizeof(box));  // 8: 공용체의 전체 크기는 가장 큰 자료형의 크기

    
    printf("%f\n", box.b);  //297576637150958620000000000000.000000
    printf("%s\n", box.c);     // happy

    return 0;
}

 

결괏값