【冷知識】sizeof

struct testcfg *pstCfg;
ulMsgLen = sizeof(*pstCfg) + (sizeof(pstCfg->astBaseCfg[0]) * (TYPE_NUM_MAX - 1));
pstSynTypeCfg = (struct testcfg *)calloc(1, ulMsgLen);

今天同事在幫忙review代碼指出,上述代碼存在訪問空指針的問題。咋一看我也嚇了一跳,但是這段代碼明明可以正常運行啊,於是上網探索答案,結論如下:


當sizeof作用於表達式時,這個表達式將會在編譯時進行分析,已確定它的類型,但這個表達式不會被求值。這就是爲什麼上面那段代碼可以被正確執行的原因,因爲sizeof(*pstCfg)並沒對指針進行解引用,而是確定了指針所指向的類型。


擴展


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

可以在不定義結構體變量的情況下計算結構體成員的大小。


x = sizeof(pstCfg); // x的值爲在32位操作系統下爲4,在64位操作系統下爲8,聰明的大家一定已經明白了,sizeof (pointer)返回的時指針變量的長度
x = sizeof(*pstCfg); // x的值爲struct testcfg的大小,sizeof(*pointer)返回指針類型的大小

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章