結(jié)構(gòu)體成員所占內(nèi)存空間大小

一般情況下,如果想知道結(jié)構(gòu)體成員的內(nèi)存占用情況需要:
1、先用結(jié)構(gòu)體在內(nèi)存中開空間
2、使用sizeof(結(jié)構(gòu)體變量.成員名)或者sizeof(結(jié)構(gòu)體指針->成員名)的形式獲取成員在內(nèi)存中所占空間大小,舉例如下:
#include#include
typedef struct{ int id; char ch;}data;
int main(){ data a; // 結(jié)構(gòu)體變量 data *p = (data *)malloc(sizeof(data));
// 結(jié)構(gòu)體變量用點(diǎn)語法 printf("方式一:成員id大小:%d,ch大小:%d\n", sizeof(a.id),sizeof(a.ch));
// 結(jié)構(gòu)體指針用 -> printf("方式二:成員id大小:%d,ch大小:%d\n", sizeof(p->id),sizeof(p->ch));
return 0;}
此方法需要在內(nèi)存中開辟空間。

在閱讀源碼的時候偶然發(fā)現(xiàn)了一種非常妙的寫法:可以將結(jié)構(gòu)體指針強(qiáng)制指向地址為0的區(qū)域,然后直接用sizeof訪問成員。
printf("方法三:成員id大小:%d,ch大小:%d\n", sizeof(((data *)0)->id),sizeof(((data *)0)->ch));
地址為0的區(qū)域為保留區(qū),程序運(yùn)行時并不會真正在內(nèi)存中開空間,這里可以理解為借用了0值。
為了通用,可以將這種方法進(jìn)行宏定義:
#define size_of_attribute(Struct, Attribute) sizeof(((Struct*)0)->Attribute)
Struct --- 結(jié)構(gòu)體類型名字
Attribute--- 結(jié)構(gòu)體成員名測試代碼如下,你也快去試一下吧!
#include#include
#define size_of_attribute(Struct, Attribute) sizeof(((Struct*)0)->Attribute)
typedef struct{ int id; char ch;}data;
typedef struct{ double d; short m;}data2;
int main(){ printf("%d\n",size_of_attribute(data,ch)); printf("%d\n",size_of_attribute(data2,d)); return 0;}
-
內(nèi)存
+關(guān)注
關(guān)注
9文章
3210瀏覽量
76376 -
源碼
+關(guān)注
關(guān)注
8文章
685瀏覽量
31320 -
結(jié)構(gòu)體
+關(guān)注
關(guān)注
1文章
131瀏覽量
11372
發(fā)布評論請先 登錄
變頻器是否真的省電?
小藝開放平臺快速創(chuàng)建鴻蒙智能體
10個例子代碼,C語言結(jié)構(gòu)體的高級
一個經(jīng)典的結(jié)構(gòu)體和聯(lián)合體共用的實(shí)例
結(jié)構(gòu)體聲明與定義
typedef結(jié)構(gòu)體使用
為什么不建議用匿名結(jié)構(gòu)體
網(wǎng)絡(luò)接口:數(shù)字世界的“門鈴”,你了解多少?
網(wǎng)絡(luò)通訊的結(jié)構(gòu)及地址
C語言結(jié)構(gòu)體使用
干擾可以提高測量精度,是真的嗎?
定義IO初始化結(jié)構(gòu)體
滲壓計在混凝土結(jié)構(gòu)體中的安裝指南
你是否真的了解結(jié)構(gòu)體占用了多少字節(jié)?
評論