前言
一直以來,計算一個變量所佔用內存的字節數,或者計算一個數組的元素個數,習慣使用sizeof() 這個關鍵字, 這個關鍵字有點特殊,還帶有個括號。其實不帶括號也是可以的,用空格代替,但是審美上,就沒那麼美觀了。
問題再現
#include "stdio.h"
int main(int argc, char *argv)
{
const char *acStr[3]= {"111","222","333"};
int i;
for(i=0;i<sizeof(acStr);i++)
{
printf("%s.\n",acStr[i]);
}
return 0;
}
初看沒問題,可是一旦運行,就導致內存越界溢出了,因爲此時sizeof(acStr) 並不是等於3,而是12(32位機器上),博主的示例代碼,運行之後很容易從打印信息中看出來端倪,是sizeof(acStr)出現了問題,但是當時博主實際情況並不這麼明顯,在調用函數gethostbyname()時,出現錯誤,繼而出現段錯誤,後面想了很久並做了調試才知道,原來sizeof(acStr) 並不是我想要的結果。
總結
char *acStr[3] 和 char aChar[3]
在使用sizeof()計算數組元素個數時,很容易在主觀上認爲是相等的,可實際上char acStr[3] 的 char 是描述其數組元素的類型,即指針類型,而指針類型在32位機器上是佔用4個字節,這也就是爲什麼sizeof(acStr)會等於12的原因了, 博主在這裏描述這個坑,一來警醒自己,二來也提醒讀者。
同時計算數組元素個數,在使用sizeof時,一個好的習慣如下:
sizeof(數組名)/sizeof(數組元素的類型)
本博文的示例如下:
sizeof(acStr)/sizeof(char *)
自己一時的偷懶,習慣在計算字符型數組元素個數時使用sizeof(數組名),其實這裏存在隱患,把數組所佔用字節數當作數組元素個數了,因爲此時的數組元素類型是char型,恰巧佔用一個字節。一旦定義多字節的數組時,就容易習慣性的按照以前的計算方法進行計算,很容易導致錯誤。