關於sizeof 和 strlen深坑全解析

2021-09-08 19:37:51 字數 1642 閱讀 6942

大家都知道,sizeof和strlen可以用來獲取大小,但是有著不同的用法,這裡首先總結區別,最後根據sizeof 和 strlen 的具體事例來分析特別需要注意的事項。

1.sizeofsizeof是操作符,strlen是函式。 操作符的結果型別是size_t,它在標頭檔案中typedef為unsigned int型別。 該型別保證能容納實現所建立的最大物件的位元組大小。

2.sizeof可以用型別做引數,strlen只能用char*做引數,且必須是以』』\0』'結尾的。

sizeof還可以用函式做引數,比如:

shortf(

);printf

("%d\n"

,sizeof(f

()))

;//輸出的結果是sizeof(short),即2。

3.陣列做sizeof的引數不退化,傳遞給strlen就退化為指標了。

4.大部分編譯程式 在編譯的時候就把sizeof計算過了,是型別或是變數的長度。這就是sizeof(x)可以用來定義陣列維數的原因。 當用於乙個結構型別時或變數, sizeof 返回實際的大小, 當用於靜態地空間陣列, sizeof 歸還全部陣列的尺寸。 sizeof 操作符不能返回動態地被分派了的陣列或外部的陣列的尺寸

char str[20]

="0123456789"

;int a=

strlen

(str)

;//a=10;

int b=

sizeof

(str)

;//而b=20;

而strlen的結果要在執行的時候才能計算出來,用來計算字串的長度,不是型別佔記憶體的大小。

5.sizeof後如果是型別必須加括號,如果是變數名可以不加括號。這是因為sizeof是個操作符不是個函式。

在使用的時候,其實把握乙個原則就可以正確使用sizeof和strlen:對於陣列、字串的實際長度用strlen,而對於結構體等的實際大小用sizeof。但是,其實還有些需要注意的地方,先看看下面的測試**:

#include

#define protocol_string "bittorrent protocol"

void

test1()

void

test2()

void

test3()

; std:

:cout <<

"sizeof(msg) = "

<<

sizeof

(msg)

<<

" strlen(msg) = "

<<

strlen

(msg)

<< std:

:endl;

return;}

intmain()

test1()展示給大家的是乙個bt協議的握手報文,中間填充了8個0,導致strlen使用失敗。test2()表達的是使用malloc申請的字串空間用sizeof是無法正確識別的。test3()和test1()類似。

總結一下:

1. 對於中間填充了0的陣列禁用str組函式,否則會出現意外的錯誤。

2. 對於malloc申請空間的字串指標禁用sizeof,因為無法正確識別。

關於strlen和sizeof的陷阱

一,strlen是乙個庫函式,計算指定的字串包含的字元個數,要求輸入的串必須以 0 結束,但計算的字元個數不包含 0 本身。例子 1,char sztest 100 注意這裡還沒進行初始化,裡面的資料是隨機的 strlen sztest 此時輸出的資料取決於陣列sztest裡面的 0 在什麼位置結束...

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 其實我們也是...