五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

第 21 講:聯(lián)合體

2021-09-26 23:34 作者:SunnieShine  | 我要投稿

前文我們描述了結(jié)構(gòu)體的內(nèi)容,我們知道了結(jié)構(gòu)體需要堆內(nèi)存的分配模式才可以正常分配變量,記得 free 函數(shù)釋放,記得判斷是否分配成功,還學(xué)習(xí)了如何使用 sizeof 關(guān)鍵字來獲取變量(或結(jié)構(gòu)體類型)的所占內(nèi)存大小。下面我們來看另外一種模型:聯(lián)合體(Union)。


不要嘗試用聯(lián)合體

可以通過名字看出,它就是并集的英文名,它和結(jié)構(gòu)體非常相近,但它可能更加奇怪:它的元素儲存機(jī)制并不是挨著放的,而是從同一點開始。

假如,我們依舊使用 student 作為類型名,不夠把關(guān)鍵字改為 union

如果我們定義一個變量,并為其分配好內(nèi)存:

這樣就可以了?,F(xiàn)在我們按照類似的方式來為聯(lián)合體的字段賦值:

我們并沒有為其把所有字段都賦好值,而僅為 age 字段賦值 63,而把 name 的第一個字符位置賦值我 A 字符。這已經(jīng)足以說明問題?,F(xiàn)在我們嘗試重新輸出 age 字段結(jié)果,你就會發(fā)現(xiàn)奇怪的地方。

此時,你會發(fā)現(xiàn)輸出結(jié)果一定不會是 63,而是一個非常大的數(shù)。這很奇怪,因為我們在賦值了 63 后再也沒動過 age 字段的信息,就簡單為 name 的第一個字符位置賦值了一下,竟然修改了 age 字段的結(jié)果。

聯(lián)合體在分配內(nèi)存的時候,是全部都在頭部對齊的,這也就意味著,如果我們分配的 a 指針指向內(nèi)存假設(shè)為 0x123 的位置上的話,那么 0x123 就是所有四個字段的起始點。這樣一來,修改一處字段,自然就會同時影響到其它字段的結(jié)果。

所以,不要嘗試使用聯(lián)合體。


既然這樣,聯(lián)合體有什么樣的用途呢?

在非常罕見的情況下,我們需要節(jié)約內(nèi)存。當(dāng)我們不得不把多個信息點都放在同一個地方存儲來節(jié)約內(nèi)容,而且這些信息僅在調(diào)用時有效,其它時候根本不用的情況下,可以考慮使用聯(lián)合體。

不過,這種情況實在是太少了。


聯(lián)合體的內(nèi)存大小

前文講述了結(jié)構(gòu)體的內(nèi)存大小的計算。聯(lián)合體的內(nèi)存大小其實也很好求得。前文已經(jīng)完全描述了所有有關(guān)聯(lián)合體定義分配內(nèi)存時候的模式:同時對齊在開頭地址。所以它的總大小,取決于所有字段里最“長”的那一個,所以,sizeof(union student) = 20。


第 21 講:聯(lián)合體的評論 (共 條)

分享到微博請遵守國家法律
岑溪市| 莱阳市| 孝义市| 乌苏市| 波密县| 甘谷县| 泌阳县| 若羌县| 惠东县| 张家界市| 美姑县| 禹城市| 民权县| 辰溪县| 岳阳市| 巴东县| 安远县| 和田市| 菏泽市| 岱山县| 左贡县| 双鸭山市| 阳原县| 司法| 高雄市| 响水县| 康定县| 阜城县| 洛隆县| 富源县| 卓资县| 工布江达县| 凉山| 福建省| 二手房| 贺州市| 四平市| 仁怀市| 延川县| 秭归县| 巍山|