sizeof() 計算字符型指針數組元素個數時要注意

前言

一直以來,計算一個變量所佔用內存的字節數,或者計算一個數組的元素個數,習慣使用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型,恰巧佔用一個字節。一旦定義多字節的數組時,就容易習慣性的按照以前的計算方法進行計算,很容易導致錯誤。

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