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...