天天看點

正确了解sizeof和strlen的用法,這一篇就夠了

1、關于數組做sizeof的參數不退化,作函數形參傳遞給sizeof則退化為指針的準确了解

sizeof操作的對象為指針時,得到的結果是指針的大小(32位系統為4位元組,64位為8位元組)。但對象為數組時,得到的結果是整個數組的大小。但有一種情況除外,參看下圖。

正确了解sizeof和strlen的用法,這一篇就夠了

數組作形參傳遞給子函數,其在子函數中會變為指針。

此時對其進行sizeof運算,又變成了對指針進行運算。結果看上圖所示。

(網上有“數組做sizeof的參數不退化,傳遞給strlen則退化為指針”的說法,不知道是什麼意思,有知道的同學可以教我一下。)

2、strlen函數用來計算字元串中字元的個數

strlen隻能用來計算字元數組的大小,不能計算其他類型數組大小。實際使用中常常有人會誤用來計算int類型等其他類型數組的大小,這是得不到結果的。

正确了解sizeof和strlen的用法,這一篇就夠了

strlen是庫函數,計算數組大小時從給定的位址開始,到遇到第一個'\0'結束。

3、sizeof運算符不可以用來計算字元串的長度

sizeof用于擷取類型或表達式所占記憶體的大小,而不可以用來計算字元串的長度。如果你一定要這麼做,那将會得到如下結果:

正确了解sizeof和strlen的用法,這一篇就夠了

即得到的是指針的大小。計算字元串長度應使用strlen函數,而非sizeof運算符。

但如果用sizeof來計算字元數組則又是另一種情況,具體參考1中所述。

從此也可以看出字元串雖然在某些情況下可以當作字元數組來使用,但兩者不能完全等同。因為字元串存放在記憶體中的字元串常量區,而字元數組則存放于棧區,存放的記憶體塊不一樣,導緻兩者具有不同的特性。

4、sizeof運算符計算malloc配置設定的記憶體同樣隻能得到指針的大小

sizeof計算malloc申請的空間,得到的大小是指針的大小:

正确了解sizeof和strlen的用法,這一篇就夠了