Recircle 2019. 6. 3. 11:47

공용체

- 같은 메모리 영역을 여러 개의 변수가 공유

- 공용체를 선언하고 사용하는 방법은 구조체와 아주 비슷


1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
 
union example {
    char c;
    int i;
};
int main()
{
    union example  ex;
    printf("%p\t%p\n"&ex.c, &ex.i);
}
cs

--컴퓨터 마다 주소값은 다르지만 c, i 둘다 같은 주소값이 출력된다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
 
union example {
    char c;
    int i;
};
 
int main()
{
    union example  v;
    v.c = 'A';
    printf("v.c:%c v.i%d\n", v.c, v.i);
 
    v.i = 10000;
    printf("v.c:%c v.i%d\n", v.c, v.i);
}
cs


char형의 멤버c에 'A'를 대입하면 공용체의 각멤버들을 출력하여보면 멤버 c만 값이 제대로 나온다.

- 다른 멤버를 통하여 출력을 하면 메모리의 같은 부분을 다르게 해석한다.

- int형의 멤버 i를 통하여 출력하면 같은 메모리 영역을 int형으로 해석을 하여 출력한다.


실행 결과



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <stdio.h>
#include <string.h>
#define REG_NUMBER 2
#define STU_NUMBER 1
 
struct student {
    int type; // 공용체가 현재 어떤 변수를 사용하는지를 저장
    union     //주민등록번호나 학번 중에서 하나를 선택한다.
    {
        int sut_number;
        char reg_number[15];
    } id;
    char name[20];
};
 
void print(struct student s)
{
    switch (s.type)            //공용체의 타입에 따라서 적절한 값을 출력한다.
    {
    case STU_NUMBER:
        printf("학번 %d\n", s.id.sut_number);
        printf("이름 : %s\n", s.name);
        break;
    case REG_NUMBER:
        printf("주민등록번호 : %s\n", s.id.reg_number);
        printf("이름 : %s\n", s.name);
        break;
    default:
        printf("타입 오류 \n    ");
        break;
    }
}
 
int main()
{
    struct student s1, s2;
 
    s1.type = STU_NUMBER;            //학번 사용
    s1.id.sut_number = 20190001;
    strcpy(s1.name, "홍길동");
 
    s2.type = REG_NUMBER;
    strcpy(s2.id.reg_number, "860101-1056076"); // 주민등록번호 사용
    strcpy(s2.name, "김철수");
 
    print(s1);
    print(s2);
}    
cs


실행 결과