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