【C語言】這種求結構體成員大小的方法,你可能需要了解一下~
在C語言程式設計中,有時候需要知道某結構體中某成員的大小,比如使用堆記憶體來儲存結構體中的某成員時,需要知道該成員的大小,才好確定所需申請的空間大小。求某結構體中某成員的大小,你會怎麼做?
例子:
typedef struct { char a; char c; short b; int d; char e; }test_struct;
求 d 成員所佔記憶體空間的大小。
方法一
萌新嘗試法。。。
我們可以先定義一個結構體變數,然後再使用sizeof求出。
#include <stdio.h> typedefstruct { 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)求出。然後想咋用就咋用。這個簡單就不討論了。
方法三
裝X法。。。
程式碼:
#include <stdio.h> 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 <stdio.h> #include <stddef.h> #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++程式設計學習基地【點選進入】!
都是學程式設計小夥伴們,帶你入個門還是簡簡單單啦,一起學習,一起加油~
還有許多學習資料和視訊,相信你會喜歡的!
涉及:遊戲開發、常用軟體開發、程式設計基礎知識、課程設計、黑客等等......