54.3 공용체 포인터를 선언하고 메모리 할당하기

구조체와 마찬가지로 공용체도 포인터를 선언할 수 있으며 공용체 포인터에는 malloc 함수를 사용하여 동적 메모리를 할당할 수 있습니다.

  • union 공용체이름 *포인터이름 = malloc(sizeof(union 공용체이름));

다음 내용을 소스 코드 편집 창에 입력한 뒤 실행해보세요.

union_alloc_memory.c

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

union Box {    // 공용체 정의
    short candy;
    float snack;
    char doll[8];
};

int main()
{
    union Box *b1 = malloc(sizeof(union Box));    // 공용체 포인터 선언, 메모리 할당

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

    strcpy(b1->doll, "bear");     // doll에 문자열 bear 복사

    printf("%d\n", b1->candy);    // 25954
    printf("%f\n", b1->snack);    // 4464428256607938511036928229376.000000
    printf("%s\n", b1->doll);     // bear

    free(b1);    // 동적 메모리 해제

    return 0;
}

실행 결과

8
25954
4464428256607938511036928229376.000000
bear

먼저 union Box *b1과 같이 union 키워드와 공용체 이름을 사용하여 공용체 포인터를 선언합니다. 일반 변수가 아닌 포인터 변수이므로 반드시 *을 붙입니다. 그리고 malloc 함수로 메모리를 할당 할 때 크기를 알아야 하므로 sizeof(union Box)와 같이 공용체 크기를 구하여 넣어줍니다.

union Box *b1 = malloc(sizeof(union Box));    // 공용체 포인터 선언, 메모리 할당

구조체와 마찬가지로 공용체 포인터도 멤버에 접근할 때는 -> (화살표 연산자)를 사용합니다.

strcpy(b1->doll, "bear");     // doll에 문자열 bear 복사

printf("%d\n", b1->candy);    // 25954
printf("%f\n", b1->snack);    // 4464428256607938511036928229376.000000
printf("%s\n", b1->doll);     // bear

strcpy(b1->doll, "bear");와 같이 공용체 포인터의 멤버에 접근한 뒤 문자열을 복사하고, b1->doll과 같이 값을 가져옵니다. 또한, 공용체 포인터도 멤버 중에서 가장 큰 자료형의 공간을 공유합니다.

마지막으로 free(b1);처럼 할당한 메모리를 해제해줍니다. 즉, 공용체에 메모리를 할당할 때는 malloc → 사용 → free 패턴을 기억하세요.

참고 | 공용체 별칭과 익명 공용체 포인터에 메모리 할당하기

typedef로 정의한 공용체 별칭으로도 포인터를 선언하고 메모리를 할당할 수 있습니다.

  • 공용체별칭 *포인터이름 = malloc(sizeof(공용체별칭));

typedef_union_alloc_memory.c

typedef union _Box {    // 공용체 이름은 _Box
    short candy;
    float snack;
    char doll[8];
} Box;                  // typedef를 사용하여 공용체 별칭을 Box로 정의

Box *b1 = malloc(sizeof(Box));    // 공용체 포인터 선언, 메모리 할당

다음과 같이 공용체 포인터에 메모리를 할당하지 않고, 공용체 변수를 그대로 활용할 수 있습니다.

  • 공용체포인터 = &공용체변수;

pointer_to_union.c

union Box {
    short candy;
    float snack;
    char doll[8];
};

int main()
{
    union Box b1;      // 공용체 변수 선언
    union Box *ptr;    // 공용체 포인터 선언

    ptr = &b1;    // b1의 메모리 주소를 구하여 ptr에 할당

    strcpy(ptr->doll, "bear");     // doll에 문자열 bear 복사

    printf("%d\n", ptr->candy);    // 25954
    printf("%f\n", ptr->snack);    // 4464428256607938511036928229376.000000
    printf("%s\n", ptr->doll);     // bear

    return 0;
}

지금까지 공용체에 대해 알아보았는데 개념이 좀 어려운데다가 리틀 엔디언 때문에 값이 뒤집혀서 이해하기가 힘들었습니다. 일단은 이런 기능이 있다 정도로만 알아두고 넘어가도 됩니다.