結(jié)構(gòu)體
結(jié)構(gòu)體占用的內(nèi)存大小,首先和編譯器的系統(tǒng)位數(shù)有關(guān)系,類似于CPU是 64 bits 還是 32 bits 的情形;其次,結(jié)構(gòu)體需要考慮字節(jié)對齊的問題。實際上占用的內(nèi)存大小, 在 Linux 中可以 使用 sizeof 進行獲取,默認為字節(jié)對齊的大小。
聯(lián)合體
聯(lián)合體的參數(shù)共享同一個內(nèi)存地址,所占的內(nèi)存大小完全是由聯(lián)合體中參數(shù)類型決定字長,然后數(shù)據(jù)共享,內(nèi)存共享等。
結(jié)構(gòu)體和聯(lián)合體連用例子:1、首先定義一個結(jié)構(gòu)體,內(nèi)部包含聯(lián)合體,如下;
#defineMAX_SOFTKEY_LEN4
typedefenum
{
ENUM_TRANSFER,
ENUM_CONFERENCE,
ENUM_ANSWER,
ENUM_HOLD,
}KeyType;
typedefstructtag_CallRecordInfo
{
charline;//currentrecordingline.
unsignedcharstate;//currentmachinestate.
unsignedshorttotal;//currenttotalusedlines.
KeyTypetype;
union
{
charTransferkey[MAX_SOFTKEY_LEN];//transferkeybuffer
charConferencekey[MAX_SOFTKEY_LEN];//conferencekeybuffer
charAnswerKey[MAX_SOFTKEY_LEN];//talkingkeybuffer
charHoldKey[MAX_SOFTKEY_LEN];//holdkeybuffer
}SoftKey;
}CallRecordInfo;
解釋如下結(jié)構(gòu)體:
聯(lián)合體union表示公用一個4字節(jié)的內(nèi)存,并且定義了一個聯(lián)合體變量SoftKey,這個 聯(lián)合體最大的好處就是在賦值或者清空時能夠直觀地清楚,不需要再引用聯(lián) 合體的參數(shù)。如: CallRecordInfoinfo; 對 info.SoftKey 的操作會影響聯(lián)合體內(nèi)部參數(shù)的值,并且數(shù)值一致。也 就是說,我們只要對info.SoftKey進行賦值即可,然后聯(lián)合體內(nèi)的參 數(shù)內(nèi)容是一樣的。即: info.SoftKey=info.SoftKey.TransferKey.
2、結(jié)構(gòu)體占用的內(nèi)存大小(作者的機器為 Ubuntu 18.04, sizeof(int) = 4 的機器)

3、整體代碼
#include#include #include #defineMAX_SOFTKEY_LEN4 typedefenum { ENUM_TRANSFER, ENUM_CONFERENCE, ENUM_ANSWER, ENUM_HOLD, }KeyType; typedefstructtag_CallRecordInfo { charline;//currentrecordingline. unsignedcharstate;//currentmachinestate. unsignedshorttotal;//currenttotalusedlines. KeyTypetype; union { charTransferkey[MAX_SOFTKEY_LEN];//transferkeybuffer charConferencekey[MAX_SOFTKEY_LEN];//conferencekeybuffer charAnswerKey[MAX_SOFTKEY_LEN];//talkingkeybuffer charHoldKey[MAX_SOFTKEY_LEN];//holdkeybuffer }SoftKey; }CallRecordInfo; CallRecordInfoRecordInfo; voidSetSoftKeyValue(intstate,KeyTypetype,char*keybuf) { RecordInfo.state=state; RecordInfo.type=type; memset(&RecordInfo.SoftKey,0,MAX_SOFTKEY_LEN); if(NULL!=keybuf) { memcpy(&RecordInfo.SoftKey,keybuf,MAX_SOFTKEY_LEN); } } intmain(intargc,charconst*argv[]) { charbuf[4]="123"; SetSoftKeyValue(0,ENUM_TRANSFER,buf); printf(" %s---%lu ",RecordInfo.SoftKey.Conferencekey,sizeof(CallRecordInfo)); return0; }
4、結(jié)果

審核編輯:湯梓紅
-
cpu
+關(guān)注
關(guān)注
68文章
11277瀏覽量
224956 -
Linux
+關(guān)注
關(guān)注
88文章
11758瀏覽量
219013 -
內(nèi)存
+關(guān)注
關(guān)注
9文章
3209瀏覽量
76360 -
編譯器
+關(guān)注
關(guān)注
1文章
1672瀏覽量
51599 -
結(jié)構(gòu)體
+關(guān)注
關(guān)注
1文章
131瀏覽量
11372
原文標題:一個經(jīng)典的結(jié)構(gòu)體和聯(lián)合體共用實例
文章出處:【微信號:工程師進階筆記,微信公眾號:工程師進階筆記】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
一個經(jīng)典的結(jié)構(gòu)體和聯(lián)合體共用的實例
430編程C語言常識(IAR)之結(jié)構(gòu)體與聯(lián)合體
DLL導入結(jié)構(gòu)體 聯(lián)合體
聯(lián)合體問題
如何定義了這個聯(lián)合體?
為什么位域結(jié)構(gòu)體與聯(lián)合體一起使用?
結(jié)構(gòu)體與共用體的區(qū)別
結(jié)構(gòu)體和聯(lián)合體的區(qū)別到底在哪里
如何利用聯(lián)合體去判斷大小端呢
聯(lián)合體/共用體的使用方法
結(jié)構(gòu)體struct和聯(lián)合體union的區(qū)別?
C語言:結(jié)構(gòu)體、聯(lián)合體嵌套使用的實用操作
c語言中結(jié)構(gòu)體有聯(lián)合體的區(qū)別
經(jīng)典 C 語言編程,結(jié)構(gòu)體和聯(lián)合體如何共用?
一個經(jīng)典的結(jié)構(gòu)體和聯(lián)合體共用實例
評論