공용체
구조체는 멤버끼리 메모리 공간을 따로 쓰는 데, 공용체는 메모리 공간을 멤버끼리 같이 쓴다는 점에서 그 차이가 있다.
위의 논리적 그림에서 보듯 공용체는 가장 큰 자료형의 메모리 공간을 공유한다.
●공용체 선언문법
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;
}
'프로그래밍 언어 > C' 카테고리의 다른 글
C언어 30강) 포인터 연산 사용하기 (0) | 2020.11.17 |
---|---|
C언어 29강) 자료형 변환하기 (0) | 2020.11.16 |
C언어 27강)++ &연산자로 구조체(struct)포인터에 구조체 변수 할당하기 (0) | 2020.11.16 |
C언어 27강)+ 구조체(struct)의 멤버가 포인터 일 때, 구조체 포인터 변수 선언(동적메모리할당) (0) | 2020.11.15 |
C언어 27강) 구조체(struct) 포인터 기본 (0) | 2020.11.15 |