C語言之union共同體

2021-08-01 08:36:05 字數 4157 閱讀 2019

union共同體的定義;

union空間長度的分配;

共同體個變數相互影響及原因;

union的使用樣例;

新名詞記錄

在c語言中,給我們提供了分配和操作一塊記憶體的方式,那就是union關鍵字。union關鍵字,定義union下面的成員變數共享一塊記憶體,每乙個成員在任一時刻有且只有乙個成員使用此塊記憶體。

因為c語言只管分配一段空間,至於裡面放什麼內容,系統都不會管。結構體strcut也是如此。

下面直接看如何定義union共同體。共同體是會按照成員中最大的乙個資料長度分配空間。

union data;
解釋:在上面的共同體中,定義了3個成員,i占用4個位元組,d占用8個位元組,而str則占用20個位元組,所以data的空間長度是20個位元組。

data共同體名字可以不寫,而在最後面也可以加入union的名字,建立union的同時,建立union變數,這個寫法和strcut是一樣的。eg

union datad1, d2;

d1.i = 11;

d2.i = 12;

因為有20個位元組的空間,裡面放入什麼內容,取決於我們。例如下面的例子

union u uu;  

uu.i = 10;

printf("%d\n",uu.i); //輸出10

//下面根據每個位元組放入字元

char * c;

c = (char *)&uu;//把union的首位址賦值、強轉成char型別

c[0] = 'a';

c[1] = 'b';

c[2] = 'c';

c[3] = '\0';

c[4] = 'd';

c[5] = 'e';

//最多能到c[19]

printf("%s\n", c);//利用結束符'\0'列印字串"abc"

printf("%c

%c%c

%c%c

%c\n",c[0],c[1],c[2],c[3],c[4],c[5]);

//分別輸出a, b, c, , d, e ,\0輸出為空格

可以在上面看到,我們其實分別在第乙個,第二個…等位元組中存入了小寫字元的值,然後輸出每個位元組,那麼對應的就是每個代表的字元了。

那麼union的分配是按照怎樣的規則來分配的呢?

我們看下面的例子。

/**

* union分配空間大**明

*/void unionsizetest()

; union sizetest uniona;

union sizetest unionb;

union sizetest unionc;

printf("the initial address of uniona is %p\n",&uniona);

printf("the initial address of unionb is %p\n",&unionb);

printf("the initial address of unionc is %p\n",&unionc);

//證明union分配的空間其實是連續分配的

/** * the initial address of uniona is 0x7fff53801b08 140734594292488

the initial address of unionb is 0x7fff53801b00 140734594292480

the initial address of unionc is 0x7fff53801af8 140734594292472

*/}

從列印的結果可以看出,a和b的位址差了0x08,而b和c之間也是差了0x8,可以看到相鄰的兩個union變數的空間長度都間隔8個位元組。而這個位元組則是double變數b的儲存大小。因此,這裡可以知道,union分配空間是,是按著最大的變數來進行分配的。

如果定義了幾個變數,但是在沒有使用之前,就重新賦值,那麼前後的值就會有覆蓋。具體問題如下所示。

void unittest();

union data

data;

data.i = 10;

printf("data.i=%d\n", data.i);

data.f = 225.6;

printf("data.f=%f\n",data.f);

strcpy(data.str, "tanksu");

printf("data.str=%s\n", data.str);

//如果直接全部賦值,那麼裡面的值就有損壞

//如下**

/*** data.i = 10;

data.f = 220.5;

strcpy( data.str, "c

programming");

* * 輸出:

* data.i : 1917853763

data.f : 4122360580327794860452759994368.000000

data.str : c

programming

*/}

上面的結果可以看出來:共用體成員之間會相互影響,修改乙個成員的值會影響其他成員。

那麼這是如何來影響的呢?

這個共同體需要的空間長度為20個位元組,那麼我們填充i,只需要填充前面4個位元組,而填充f,則需要前面8個位元組,但是如果我填充str,則取藥填充20個位元組。一句話來說,填充f,會影響i;填充str,則會影響i和f。

那麼就可以知道,在我們填充了c programming字串之後,i只需要前4位的位元組,f需要前8位的位元組。那麼取出來對應的unicode碼對應的字元應該就不是前面賦值給i和f對應的字元了。那麼導致的原因也就出來了。

(來自乙個例項是: 現有一張關於學生資訊和教師資訊的**。學生資訊包括姓名、編號、性別、職業、分數,教師的資訊包括姓名、編號、性別、職業、教學科目。

f 和 m 分別表示女性和男性,s 表示學生,t 表示教師。

如果把每個人的資訊都看作乙個結構體變數的話,那麼教師和學生的前 4 個成員變數是一樣的,第 5 個成員變數可能是 score 或者 course。當第 4 個成員變數的值是 s 的時候,第 5 個成員變數就是 score;當第 4 個成員變數的值是 t 的時候,第 5 個成員變數就是 course。

#include 

#include

#define total 4 //人員總數

struct sc;

} bodys[total];

int main()else

fflush(stdin);

}//輸出人員資訊

printf("\nname\t\tnum\t***\tprofession\tscore / course\n");

for(i=0; iif(bodys[i].profession == 's')else

}return0;}

/*執行結果:

input info: hanxiaoxiao 501 f s 89.5↙

input info: yanweimin 1011 m t math↙

input info: liuzhentao 109 f t english↙

input info: zhaofeiyan 982 m s 95.0↙

name num *** profession score / course

hanxiaoxiao 501 f s 89.500000

yanweimin 1011 m t math

liuzhentao 109 f t english

zhaofeiyan 982 m s 95.000000

*/

上面講到了union共同體的定義,如何分配空間,以及變數之間賦值錯亂的導致原因。其實最主要的還是要理解union的空間分配以及基本資料型別占用的儲存位元組數。最後引用了乙個union使用的例子,方便理解。

C語言共同體

共同體型別 設有字元型變數c 整型變數j,若這二個變數在使用過程中互斥,即當用到c時,一定不用j,當用j時,一定不用c,則無需為二個變數分配不同的儲存空間,而可使二個變數共同使用乙個儲存空間,如圖8.1所示。具有這種儲存特性的變數稱為共同體型別的變數。要定義共同體型別變數,必須先定義共同體型別。共同...

結構體,共同體

共用體 構造資料型別,也叫聯合體 用途 使幾個不同型別的變數共佔一段記憶體 相互覆蓋 結構體是一種構造資料型別 用途 把不同型別的資料組合成乙個整體 自定義資料型別 結構體變數所佔記憶體長度是各成員佔的記憶體長度的總和。共同體變數所佔記憶體長度是各最長的成員佔的記憶體長度。共同體每次只能存放哪個的一...

SNMP協議 共同體

snmp定義了管理程序 manager 和管理 agent 之間的關係,這個關係稱為共同體 community 描述共同體的語義是非常複雜的,但其句法卻很簡單。位於網路管理工作站 執行管理程序 上和各網路元素上利用snmp相互通訊對網路進行管理的軟體統統稱為snmp應用實體。若干個應用實體和snmp...