結構體
結構體占用的內存大小,首先和編譯器的系統位數有關系,類似于CPU是 64 bits 還是 32 bits 的情形;其次,結構體需要考慮字節對齊的問題。實際上占用的內存大小, 在 Linux 中可以 使用 sizeof 進行獲取,默認為字節對齊的大小。
聯合體
聯合體的參數共享同一個內存地址,所占的內存大小完全是由聯合體中參數類型決定字長,然后數據共享,內存共享等。
結構體和聯合體連用例子:1、首先定義一個結構體,內部包含聯合體,如下;
#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;
解釋如下結構體:
聯合體union表示公用一個4字節的內存,并且定義了一個聯合體變量SoftKey,這個 聯合體最大的好處就是在賦值或者清空時能夠直觀地清楚,不需要再引用聯 合體的參數。如: CallRecordInfoinfo; 對 info.SoftKey 的操作會影響聯合體內部參數的值,并且數值一致。也 就是說,我們只要對info.SoftKey進行賦值即可,然后聯合體內的參 數內容是一樣的。即: info.SoftKey=info.SoftKey.TransferKey.
2、結構體占用的內存大小(作者的機器為 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、結果
審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
cpu
+關注
關注
68文章
10826瀏覽量
211160 -
Linux
+關注
關注
87文章
11230瀏覽量
208932 -
內存
+關注
關注
8文章
3002瀏覽量
73887 -
編譯器
+關注
關注
1文章
1618瀏覽量
49052 -
結構體
+關注
關注
1文章
130瀏覽量
10833
原文標題:一個經典的結構體和聯合體共用實例
文章出處:【微信號:工程師進階筆記,微信公眾號:工程師進階筆記】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
430編程C語言常識(IAR)之結構體與聯合體
,aa.d地址為N+1,是個奇數地址,因為430在奇數地址只能讀取一個字節,因此要訪問d成員需要讀取兩次才能完成,后果是代碼變長、速度變慢。 三. 匿名結構體與
發表于 11-22 15:43
聯合體問題
union U1{INT8Uax[4];FP32 fx;INT32Slx;INT32Uulx;INT16Six;INT16Uuix;INT8Scx;INT8Uucx;};U1 X_rom;//申請聯合接口體數據變量定義如上的一
發表于 01-04 12:13
為什么位域結構體與聯合體一起使用?
/*本例程是C語言的位域操作示例這里為什么位域結構體與聯合體一起使用?-->因為這樣定義后,即可以單獨使用標志位 也可同時使用整個字節數據主要應用:單片機C語言好處:用標志位可以節省R
發表于 07-14 06:23
經典 C 語言編程,結構體和聯合體如何共用?
中可以 使用 sizeof 進行獲取,默認為字節對齊的大小。 聯合體 聯合體的參數共享同一個內存地址,所占的內存大小完全是由聯合體中參數類型決定字長,然后數據共享,內存共享等。
評論