몽상실현개발주의

[따배씨] 14.15 공용체 Union 의 원리 본문

Language/C

[따배씨] 14.15 공용체 Union 의 원리

migrationArc 2021. 7. 5. 23:45

[따배씨] 14.15 공용체 Union 의 원리

따배씨 - 따라하며 배우는 C언어

14강 구조체_2

14.15 공용체 Union 의 원리

#include <stdio.h>

int main()
{
    /*
        Union
        - Store different data types in the same momory space
        - Strucutre vs Union
     */
    
    union my_union
    {
        int i;
        double d;
        char c;
    };
    
    union my_union uni;
    
    printf("%zd\n", sizeof(union my_union));
  	// 8
    printf("%lld\n", (long long)&uni);
  	// 140732920755232
    printf("%lld %lld %lld\n", (long long)&uni.i, (long long)&uni.d, (long long)&uni.c);
  	// 140732920755232 140732920755232 140732920755232
    
    union my_union save[10];
    
    printf("%zd\n", sizeof(save));
  	// 80
    
    return 0;
}
  • 공용체 union 은 구조체 structure 와 사용법이 유사하나 메모리 공간의 사용에 차이가 있다
    • Union 은 같은 메모리 공간을 다른 type 들이 공유하게 됨
      • 가장 큰 type 의 메모리로 할당 됨

 

 

#include <stdio.h>

int main()
{
    /*
        Union of different types
     */
    
    union my_union
    {
        int i;
        double d;
        char c;
    };
    
    union my_union uni1;
    
    uni1.c = 'A';
    printf("%c %x %d\n", uni1.c, (int)uni1.c, uni1.i);
  	// A 41 -272632767
    
    uni1.i = 0;
    uni1.c = 'A';
    printf("%c %x %d\n", uni1.c, (int)uni1.c, uni1.i);
  	// A 41 65
    
    uni1.d = 1.2;
    printf("%d %f %d %c\n", uni1.i, uni1.d, (int)uni1.c, uni1.c);
  	// 858993459 1.200000 51 3
    
    return 0;
}
  • 메모리를 공유하기 때문에, 덮어쓰는 현상이 발생

 

 

#include <stdio.h>

int main()
{
    /*
        Initializing unions
     */
    
    union my_union
    {
        int i;
        double d;
        char c;
    };
    union my_union uni1;
    uni1.i = 0;
    uni1.c = 'A';
    uni1.d = 1.2;
    
    union my_union uni2 = uni1;         // Copy another union
    union my_union uni3 = { 10 };       // First element (member) only
    union my_union uni4 = { .c = 'A' };  // Designated initializer
    union my_union uni5 = { .d = 1.23, .i = 100 };  // Do NOT recommend
    
    printf("%d %f %c\n", uni5.i, uni5.d, uni5.c);
    // 100 0.000000 d
    
    uni1.i = 123;
    uni1.d = 1.2;
    uni1.c = 'k';
    // uni1 = 'k' 로 사용하기 위한 의도가 됨
    
    return 0;
}
  • 공용체의 선언은 여러 type 을 포함 하지만, 메모리를 공유하기 때문에 초기화는 한가지 type 만 가능

 

 

 

#include <stdio.h>

int main()
{
    /*
        Initializing unions
     */
    
    union my_union
    {
        int i;
        double d;
        char c;
    };
    union my_union uni1;
    uni1.i = 0;
    uni1.c = 'A';
    uni1.d = 1.2;
    
    union my_union* pu = &uni1; // Pointer union
    int x = pu->i;  // -> operator, same as x = fit.digit
    
    uni1.c = 'A';
    double real = 3.14 * uni1.d;    // do NOT recommend
    
    return 0;
}
  • 공용체 union 은 편리하나, 실수할 가능성이 높으니 유의해야 함

 

 


이 글의 모든 사진과 내용의 출처는 홍정모 교수님께 있음을 알려드립니다.

http://blog.naver.com/atelierjpro

 

실리콘 밸리의 프로그래머 : 네이버 블로그

안녕하세요! 홍정모 블로그에 오신 것을 환영합니다. 주로 프로그래밍 관련 메모 용도로 사용합니다. 강의 수강하시는 분들은 홍정모 연구소 카페로 오세요.

blog.naver.com

http://www.inflearn.com/course/following-c

 

홍정모의 따라하며 배우는 C언어 - 인프런 | 강의

'따배씨++'의 성원에 힘입어 새롭게 개발된 C 언어로 시작하는 프로그래밍 입문 강의입니다. '따배씨'와 함께 프로그래밍 인생을 업그레이드 해보세요., 따라하며 배우는 C언어 '따배씨++'의 성원

www.inflearn.com

Comments