Unions 在C語言的簡單介紹

References:
1. http://publications.gbdirect.co.uk/c_book/chapter6/unions.html

OS      : Ubuntu 11.10 x86_64
gcc      : 4.6.1


        最近寫C語言用到了union這個 structure,一開始還不是很懂在作什麼,所以看了網路上的一些範例以及說明,以下是依照我的理解來說明。


        簡單的說就是union裏面的變數是共用同一個記憶體,資料是以最後一筆寫入變數為主,而且分配的記憶體是以最大的資料結構做為分配的依據。所以我用以下的範例來說明,當最後一筆資料是寫入un_double所以之前un_char,un_int所寫的入資料將會被換掉,畢竟是使用同一塊記憶體。在記憶體配置的部份,最大是double的size是8bytes,所以ex_type的size是8bytes。

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
#include <stdio.h>
#include <stdarg.h>
struct ex_type{
      union{
              double   un_double;
              char    un_char;
              int     un_int;
      };
};
 
int main(int argc , char ** argv){
    
    struct ex_type tt ;
    tt.un_char  = 'a';
    tt.un_int  = 10;
    tt.un_double = 10.5;
    
    printf("struct ex_type size = %d\n",sizeof(struct ex_type));
    printf("double size = %d\n",sizeof(double));
    printf("char   size = %d\n",sizeof(char));
    printf("int    size = %d\n",sizeof(int));
    printf("un_double  = %f\n",tt.un_double);
    printf("un_char  = %c\n",tt.un_char);
    printf("un_int   = %d\n",tt.un_int);
    return 0;
}

struct ex_type size = 8
double size = 8
char   size = 1
int    size = 4
un_double  = 10.500000
un_char  = 
un_int   = 0


       以下的範例是用struct重新定義新的資料型態,我定義的_coffe跟_car只有差在_car有用union去包裡面的struct。然後將這兩個資料型態實現出來並依照同樣的順序將資料寫入a,b,c,d以及wheel_a,wheel_b,wheel_c,wheel_d然後全部將結果show出來。

       接著_coffe所定義出來的size是16(因為兩個struct大小為8bytes ,8+8 = 16byte ),所以變數a,b,c,d有各自的4bytes記憶體空間。

      _car定義出來的size為8(因為兩個struct大小為8bytes),當我資料是依順寫入10,11,12,13到wheel_a,wheel_b,wheel_c,wheel_d,會發現最後的資料只有12,13所以之前的10,11的資料已經被蓋掉了,由結果可以資料兩個struct是共用8bytes(拆成兩個4bytes)的記憶體空間。

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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <stdio.h>
#include <stdarg.h>
 
#define show(...) \
    printf(__VA_ARGS__);
struct _coffe
{
    struct
    {
        int a;
        int b;
    };
    struct
    {
        int c;
        int d;
    };
};
struct _car
{
    union
    {
        struct
        {
            int wheel_a;
            int wheel_b;
        }; 
        struct 
        { 
            int wheel_c;
            int wheel_d;
        };
    };
};
int main(int argc, char ** argv)
{
    struct _coffe *coffe = (struct _coffe *) malloc(sizeof(struct _coffe)) ;
    coffe->a = 10; 
    coffe->b = 11; 
    coffe->c = 12; 
    coffe->d = 13;
    show("struct _coffe size = %ld\n",sizeof(struct _coffe)); 
    show("coffe_a = %d , address = %x\n",coffe->a,&coffe->a);
    show("coffe_b = %d , address = %x\n",coffe->b,&coffe->b);
    show("coffe_c = %d , address = %x\n",coffe->c,&coffe->c);
    show("coffe_d = %d , address = %x\n",coffe->d,&coffe->d);
    
    show("=====我是分隔線=====\n"); 
    
    struct _car *wheel = (struct _car *) malloc(sizeof(struct _car)) ;
    wheel->wheel_a = 10; 
    wheel->wheel_b = 11; 
    wheel->wheel_c = 12; 
    wheel->wheel_d = 13;
 
    show("struct _car size = %ld\n",sizeof(struct _car)); 
    show("wheel_a = %d , address = %x\n",wheel->wheel_a,&wheel->wheel_a);
    show("wheel_b = %d , address = %x\n",wheel->wheel_b,&wheel->wheel_b);
    show("wheel_c = %d , address = %x\n",wheel->wheel_c,&wheel->wheel_c);
    show("wheel_d = %d , address = %x\n",wheel->wheel_d,&wheel->wheel_d);
 
    return 0;
}

struct _coffe size = 16
coffe_a = 10 , address = 836b008
coffe_b = 11 , address = 836b00c
coffe_c = 12 , address = 836b010
coffe_d = 13 , address = 836b014
=====我是分隔線=====
struct _car size = 8
wheel_a = 12 , address = 836b020
wheel_b = 13 , address = 836b024
wheel_c = 12 , address = 836b020
wheel_d = 13 , address = 836b024





張貼留言

這個網誌中的熱門文章

解釋scope.$apply用來做什麼? -- AngularJS

JavaScript的Timer用法