這種求C語言結構體成員大小的方法,萌新們掌握了嗎

2022-06-10 14:39:11 字數 3650 閱讀 4004

在c語言程式設計中,有時候需要知道某結構體中某成員的大小,比如使用堆記憶體來儲存結構體中的某成員時,需要知道該成員的大小,才好確定所需申請的空間大小。求某結構體中某成員的大小,你會怎麼做?

例子:

typedef struct

char a; 

char c;

short b;       

int d;

char e;

}test_struct;

求 d 成員所佔記憶體空間的大小。

方法一萌新嘗試法。。。

我們可以先定義乙個結構體變數,然後再使用sizeof求出。

#include

typedef struct

char a; 

char c;

short b;       

int d;

char e;

}test_struct;

int main(void)

test_struct test_s; 

printf("sizeof(test_s.d) = %d\n", sizeof(test_s.d));

return 0;

執行結果:

但是我們為了得到乙個成員的大小,而專門定義乙個結構體變數,而這個變數也沒有其它的用途,有點浪費資源,或者說這種方法low了。

方法二肉眼觀察法。。。。。。

比如在32bit環境下,我們一眼看出d是int型別,就是4個位元組,使用sizeof(int)求出。然後想咋用就咋用。這個簡單就不討論了。

方法三裝逼法。。。。。。

**:

#include

typedef struct

char a; 

char c;

short b;       

int d;

char e;

}test_struct;

int main(void)

printf("sizeof(((test_struct*)0)->d) = %d\n", sizeof(((test_struct*)0)->d));

printf("sizeof(((test_struct*)0)->a) = %d\n", sizeof(((test_struct*)0)->a));

printf("sizeof(((test_struct*)0)->b) = %d\n", sizeof(((test_struct*)0)->b));

printf("sizeof(((test_struct*)0)->c) = %d\n", sizeof(((test_struct*)0)->c));

return 0;

執行結果:

類似 ((test_struct*)0)->d這樣的用法是個固定用法,把0位址轉換為test_struct結構的指標,對於結構體指標,使用->符號就是取其成員,再使用sizeof就可以求得其大小。這裡不一定是0位址,其它位址也可以,但一般都會使用0位址。這種方法較方法一的好處就是不用定義乙個多餘的變數。

這種方法很重要,需要掌握,可能你平時程式設計不會使用這種方法,但這種方法很重要。在很多優秀的**中會出現類似形式的巨集**,例如:

上例可封裝乙個巨集定義:

#define  mem_size(type, member)  sizeof(((type*)0)->member)

求某成員在結構體中的偏移量:

#define  offsetof(type, member)  ( (size_t)( &( ( (type*)0 )->member ) ) )

求結構體偏移量在c語言標頭檔案中 stddef.h也有提供,使用方法如:

#include

#include

#define  offsetof(type, member)  ( (size_t)( &( ( (type*)0 )->member ) ) )

typedef struct

char a; 

char c;

short b;       

int d;

char e;

}test_struct;

int main(void)

/* stddef.h巨集 */

printf("offset(a): %d\n", offsetof(test_struct, a));

printf("offset(c): %d\n", offsetof(test_struct, c));

printf("offset(b): %d\n", offsetof(test_struct, b));

printf("offset(d): %d\n", offsetof(test_struct, d));

printf("offset(e): %d\n", offsetof(test_struct, e));

/* 自定義巨集 */

printf("offsetof(a): %d\n", offsetof(test_struct, a));

printf("offsetof(c): %d\n", offsetof(test_struct, c));

printf("offsetof(b): %d\n", offsetof(test_struct, b));

printf("offsetof(d): %d\n", offsetof(test_struct, d));

printf("offsetof(e): %d\n", offsetof(test_struct, e));

return 0;   

執行結果:

使用這個求結構體偏移量的巨集我們就可以很好地知道結構體成員的在記憶體中的儲存情況。

以上就是本次分享的求結構體成員的三種方法。重點掌握方法三,因為在很多優秀的**中都有使用到類似的方法。

如有錯誤,歡迎指出!另外如果你想更好的提公升你的程式設計能力,好好學習c/c++程式設計知識的話!那麼你很幸運~「點選鏈結」加入c/c++企鵝圈,這裡還有一些你可能不知道的趣事分享喲。

c語言 sizeof 求結構體大小

運算子sizeof可以計算出給定型別的大小,對於32位系統來說,sizeof char 1 sizeof int 4。基本資料型別的大小很好計算,我們來看一下如何計算構造資料型別的大小。c語言中的構造資料型別有三種 陣列 結構體和共用體。陣列是相同型別的元素的集合,只要會計算單個元素的大小,整個陣列...

c語言sizeof求結構體的大小

運算子sizeof可以計算出給定型別的大小,對於32位系統來說,sizeof char 1 sizeof int 4。基本資料型別的大小很好計算,我們來看一下如何計算構造資料型別的大小。c語言中的構造資料型別有三種 陣列 結構體和共用體。陣列是相同型別的元素的集合,只要會計算單個元素的大小,整個陣列...

c語言sizeof求結構體的大小

運算子sizeof可以計算出給定型別的大小,對於32位系統來說,sizeof char 1 sizeof int 4。基本資料型別的大小很好計算,我們來看一下如何計算構造資料型別的大小。c語言中的構造資料型別有三種 陣列 結構體和共用體。陣列是相同型別的元素的集合,只要會計算單個元素的大小,整個陣列...