關於strlen和sizeof的陷阱

2021-04-28 00:43:54 字數 2807 閱讀 8131

一,strlen是乙個庫函式,計算指定的字串包含的字元個數,要求輸入的串必須以'/0'結束,但計算的字元個數不包含'/0'本身。

例子:1,    char sztest[100]; //注意這裡還沒進行初始化,裡面的資料是隨機的

strlen(sztest); //此時輸出的資料取決於陣列sztest裡面的'/0'在什麼位置結束

程式測試如下:

char sztest[100];

//先列印出隨機的資料,看看'/0'在**結束

for(int i=0;i<100;i++)

fprintf(stdout,"strlen(psz) = %d /n",strlen(sztest));

其中的乙個輸出是:

sztest[0]=-120,sztest[1]=-106,sztest[2]=-41,sztest[3]=-73,sztest[4]=-32,sztest[5]=49,sztest[6]=-21,sztest[7]=-73,sztest[8]=-40,sztest[9]=125,sztest[10]=-15,sztest[11]=-73,sztest[12]=-46,sztest[13]=-53,sztest[14]=-16,sztest[15]=-73,sztest[16]=-76,sztest[17]=-101,sztest[18]=4,sztest[19]=8,sztest[20]=-116,sztest[21]=120,sztest[22]=-15,sztest[23]=-73,sztest[24]=68,sztest[25]=-77,sztest[26]=-90,sztest[27]=-65,sztest[28]=122,sztest[29]=-52,sztest[30]=-16,sztest[31]=-73,sztest[32]=36,sztest[33]=51,sztest[34]=-21,sztest[35]=-73,sztest[36]=112,sztest[37]=53,sztest[38]=-21,sztest[39]=-73,sztest[40]=-36,sztest[41]=-101,sztest[42]=4,sztest[43]=8,sztest[44]=17,sztest[45]=0,sztest[46]=0,sztest[47]=0,sztest[48]=77,sztest[49]=-125,sztest[50]=4,sztest[51]=8,sztest[52]=-50,sztest[53]=112,sztest[54]=-18,sztest[55]=-73,sztest[56]=-76,sztest[57]=-101,sztest[58]=4,sztest[59]=8,sztest[60]=-116,sztest[61]=120,sztest[62]=-15,sztest[63]=-73,sztest[64]=68,sztest[65]=-77,sztest[66]=-90,sztest[67]=-65,sztest[68]=104,sztest[69]=-34,sztest[70]=-24,sztest[71]=-73,sztest[72]=-64,sztest[73]=112,sztest[74]=-18,sztest[75]=-73,sztest[76]=56,sztest[77]=121,sztest[78]=-15,sztest[79]=-73,sztest[80]=-40,sztest[81]=-78,sztest[82]=-90,sztest[83]=-65,sztest[84]=9,sztest[85]=-122,sztest[86]=4,sztest[87]=8,sztest[88]=-76,sztest[89]=-101,sztest[90]=4,sztest[91]=8,sztest[92]=-24,sztest[93]=-101,sztest[94]=4,sztest[95]=8,sztest[96]=-24,sztest[97]=-78,sztest[98]=-90,sztest[99]=-65

strlen(psz) = 45  //此時輸出的長度是45,我們可以看出sztest[45]的值恰好是0,從下標0-44共有45個字元。

//如果我們在定義陣列的時候進行初始化或者呼叫memset進行置空,則此時strlen的值變為0

char sztest[100] =;

//或者memset(sztest,0x0,sizeof(sztest));

printf("strlen(sztest)=%d/",strlen(sztest)); //此時輸出0

陷阱:指標作為函式引數輸出內容的情況

void get_content(char * pcontent);

sizeof(sztest);//還是輸出100

memset(sztest,0x0,sizeof(sztest));

sizeof(sztest);//還是輸出100

3,char *p = "tenfy";

sizeof(p);//32位機器上輸出4,指標型別是乙個四個btye表示的型別

4,char sztest[100];

char *p = sztest;

sizeof(p);//32位機器上還是輸出4,計算的仍然是指標型別的。

5,void print_sizeof(const char *p)

printf("%d",sizeof(p));

char sztest[100];

print_sizeof(sztest);

//注意這裡輸出的是4,而不是100,通過引數傳遞後的陣列指標變成了乙個普通的指標型別,計算的值變成了4了。

//理解是sizeof是在編譯期間計算的,而通過函式呼叫的引數本身無法區分是陣列還是指標,只能根據普通指標來計算,所以

//得出來的值是4,這裡要小心使用指標進行內容輸出的時候,函式體裡面不能使用sizeof來計算對應的位元組大小了。

printf("%d",sizeof(sztest));//這裡還是100

關於sizeof 和 strlen深坑全解析

大家都知道,sizeof和strlen可以用來獲取大小,但是有著不同的用法,這裡首先總結區別,最後根據sizeof 和 strlen 的具體事例來分析特別需要注意的事項。1.sizeofsizeof是操作符,strlen是函式。操作符的結果型別是size t,它在標頭檔案中typedef為unsig...

sizeof和strlen和 countof的區別

運算子,計算引數所佔記憶體 int nnum2 strlen arr 是函式,求字元的個數,不包括 0 int nnum3 countof arr windows巨集 計算陣列的元素個數 cout nnum1 cout nnum2 cout nnum3 endl int arr1 20 nnum1 ...

關於字串的sizeof 和strlen

wykxldz 這樣的乙個字串的型別是const char 所以我們在申明字串的時候可以使用這樣的形式 const char str 123456 printf lu n sizeof str printf lu n strlen str 控制台顯示的是8,6 注 指標佔的位元組數是8 其實我們也是...