구조체를 설명했는데 이와 비슷한 공용체제 대해 설명하지 않았습니다. 간단하게 공용체의 의미를 설명드리고 구조체와의 차이점 하나에 대해 설명드리겠습니다.

먼저 공용체란 구조체와 선언하는 방법이 동일한 새로운 사용자 정의 자료형입니다. 구조체는 strcut 선언을통해서 정의하고 공용체는 union 선언을 통해서 정의합니다.

#include <stdio.h>

typedef union
{
    char mem1;
    int mem2;
    double mem3;
}Uni;

int main(void)
{
    Uni un;
    printf(“%#x %#x %#x\n”, &un.mem1, &un.mem2, &un.mem3);

    return 0;
}

실행결과

0x4ffdec 0x4ffdec 0x4ffdec

계속하려면 아무 키나 누르십시오 . . .

위의 결과가 무엇을 의미할까요? 공용체의 모든 멤버들의 주소값이 똑같습니다.

구조체는 각 멤버마다 메모리공간에 할당이 되지만 공용체는 각 큰 사이즈의 멤버에 맞춰 메모리공간을 할당하고 모든 멤버가 이 메모리공간을 공유합니다.

union

#include <stdio.h>

typedef struct
{
    char mem1;
    int mem2;
    double mem3;
}St;

typedef union
{
    char mem1;
    int mem2;
    double mem3;
}Uni;

int main(void)
{
    St st;
    Uni un;

    st.mem1 = 10;
    st.mem2 = 20;
    st.mem3 = 14.123;

    printf(“%d\n”, st.mem1);
    printf(“%d\n”, st.mem2);
    printf(“%f\n”, st.mem3);

    un.mem1 = 10;
    un.mem2 = 20;
    un.mem3 = 14.123;

    printf(“%d\n”, un.mem1);
    printf(“%d\n”, un.mem2);
    printf(“%f\n”, un.mem3);

    return 0;
}

실행결과

10

20

14.123000

-27

-618475291

14.123000

계속하려면 아무 키나 누르십시오 . . .

구조체의 각 멤버는 저장된 데이터가 그대로 잘 나왔습니다. 그런데 공용체에서는 mem1과 mem2에 저장한 데이터가 아닌 알 수 없는 값들이 출력이 되었습니다. 이는 공용체의 성질 때문인데, mem3에 14.123을 저장하면서 총 8byte의 메모리공간을 덮어썼는데 mem1과 mem2는 각각 상위 1byte와 상위 4byte만 참조하므로 이상한 값이 출력된겁니다.

공용체는 구조체보다 활용빈도가 크지는 않지만 하나의 메모리공간을 여러가지 접근방식으로 접근할 수 있기때문에 유용항 측면이 있습니다.

+ Recent posts