공용체라는 것은 쓸 일이 별로 없지만, 실제 업무에서 보게 되었으므로 공부해 봤다.


사실 공부라고 할 것도 없을만큼 간단한 내용이라...


우선 공용체는 구조체와 비슷하게 생겼다.


하지만 구조체는 내부에 변수나 함수(C++)가 추가됨에 따라 그만큼 메모리를 차지하기 때문에 사용하는 메모리가 증가하지만, 공용체는 가장 큰 변수의 크기만큼 메모리를 할당하고 해당 메모리를 말 그대로 '공유'하기 때문에 더 커지지 않는다.


기본적인 개념은 다른 곳에서도 쉽게 설명하고 있기 때문에 예제를 적도록 하겠다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <string.h>
 
union MyUnion {
    unsigned char c;
    unsigned short s;
    int i;
    unsigned char myCharArray[6];
};
 
int main()
{
    MyUnion myUnion;
    memcpy(myUnion.myCharArray, "\xAA\xBB\xCC\xDD\xEE\xFF"6);
    printf("char  : %012X\n", myUnion.c);
    printf("short : %012X\n", myUnion.s);
    printf("int   : %012X\n", myUnion.i);
    printf("array : %02X%02X%02X%02X%02X%02X\n", myUnion.myCharArray[0], myUnion.myCharArray[1], myUnion.myCharArray[2], 
        myUnion.myCharArray[3], myUnion.myCharArray[4], myUnion.myCharArray[5]);
    return 0;
}
cs



간단한 예제로, union 내부에 char, short, int, char array의 4가지 변수가 선언되어 있다.


여기서 가장 큰 변수는 myCharArray로 총 6바이트를 차지한다.

따라서 공용체 MyUnion은 선언 시 6바이트의 메모리 공간을 차지하게 되며(패딩은 고려하지 않는다) 해당 공간을 나머지 변수들이 공유한다.

공유한다고 해서 따로 가지는 것이 아니라 변수마다 가장 앞에서부터, 즉 offset 0에서부터 변수의 크기만큼 메모리를 가진다.


그림으로 나타내면 다음과 같다.



[그림 1] MyUnion 메모리 구조도


 그리고 위 프로그램을 실행시켜서 나온 output은 다음과 같다.



[그림 2] 프로그램 실행 결과


왜 short와 int의 출력 결과가 저렇게 나오는지는 바이트 오더(Byte order)에 대해서 공부하면 알 수 있을 것이다.

'Programming' 카테고리의 다른 글

[Go] Defer, Panic, Recovery  (0) 2016.10.09
[DLL Injection] DLL Injector  (0) 2016.10.05
[Go] struct{} 와 &struct{} 선언의 차이점?  (3) 2016.07.23
[C++] Reference In Low-level  (0) 2016.07.02
[MITM] Create Repository 'WLAN-Crack'  (0) 2016.06.17
블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

,