sizeof和strlen經常被大家拿來作對比,但是他們之間的區別還是很大的。
一、定義不同:
sizeof是運算子,在標頭檔案中typedef為unsigned int,其值在編譯時即計算好了,引數可以是陣列、指標、型別、物件、函式等。
strlen是個函式,它的功能是:獲得保證能容納實現所建立的最大物件的位元組大小。
二、語法不同
strlen是函式,要在執行時才能計算。引數必須是字元型指標。當陣列名作為引數傳入時,實際上陣列就退化成指標了。它的功能是:返回字串的長度。該字串可能是自己定義的,也可能是記憶體中隨機的,該函式實際完成的功能是從代表該字串的第乙個位址開始遍歷,直到遇到結束符null。返回的長度大小不包括null。
sizeof引數比較多元化,它的功能是返回該變數空間的大小它會將null也算在
裡面。三、本質區別
sizeof是求資料型別所佔的空間大小
strlen是求字串的長度,字串以/0結尾
char arr1=
"abcd"
; cout <<
"sizeof(arr1):"
<<
sizeof
(arr1)
<< endl;
//---->5
cout <<
"strlen(arr1):"
<<
strlen
(arr1)
<< endl;
//---->4
//因為sizeof在計算arr1的時候將\0也計算在內
//這裡有一點一定要清楚,"abcd"是以\0結尾的
//在arr1的裡面放的是abcd\0這裡的\0當做資料也放在了陣列裡面
//而strlen在遇到\0的時候就不計算而退出函式了
const
char
* arr2 =
"abcdef"
; cout <<
"sizeof(*arr2):"
<<
sizeof
(arr2)
<< endl;
//---->4
cout <<
"strlen(*arr2):"
<<
strlen
(arr2)
<< endl;
//---->6
//sizeof的引數是乙個指標,在32位下,指標佔4個位元組
//所以sizeof的結果並不是字串的長度
//strlen計算的arr2指向的字串的長度,結果為6
int arr3=
; cout <<
"sizeof(arr3):"
<<
sizeof
(arr3)
<< endl;
//---->24
cout <<
"strlen(arr3):"
<<
strlen
(arr3)
<< endl;
//報錯
//sizeof計算的是arr3的空間,乙個int四個位元組,一共六個
//strlen的引數必須是字元指標,arr3是int的陣列,所以報錯
char arr4=
; cout <<
"sizeof(arr4):"
<<
sizeof
(arr4)
<< endl;
//---->5
cout <<
"strlen(arr4):"
<<
strlen
(arr4)
<< endl;
//---->不確定
//arr4在這裡使用strlen的時候查詢不到\0,所以就不知道會在什麼地方停止
char arr5[
3]=;
cout <<
"sizeof(arr4[3]):"
<<
sizeof
(arr5)
<< endl;
//---->6
cout <<
"strlen(arr4[3]):"
<<
strlen
(*arr5)
<< endl;
//---->4
//arr5裡面雖然只有四個資料,但是因為是二維陣列
//所以需要占用6個位置的空間,sizeof計算出來的就是6
//strlen計算的是陣列裡面資料的多少,返回值為4
//為了更好的證明strlen和sizeof的區別
//下面這個例子足以說明一切
char arr6=
; cout <<
"sizeof(arr6):"
<<
sizeof
(arr6)
<< endl;
//---->9
cout <<
"strlen(arr6):"
<<
strlen
(arr6)
<< endl;
//---->5
//sizeof遇到陣列中的'\0'並沒有停止往後走
//求出的是arr6一共占用的空間大小
//strlen在遇到'\0'的時候就停止往後走
//而直接返回乙個當前的數字當做陣列的長度了
sizeof還可以計算結構體的大小:
struct stu ;
stu stu;
cout <<
"sizeof(struct stu):"
<<
sizeof
(stu)
<< endl;
//---->12
//在結構體中,由於記憶體對齊的原因,所以結構體的大小為12
C語言strlen函式和sizeof的區別
c語言字串的兩種計算長度的方式,事實上兩者有許多不同,我們可以來 一下。sizeof sizeof 運算元所佔空間的位元組數大小 是一種c中的基本運算子。可以以型別 指標 陣列和函式等作為引數。頭檔案型別為unsigned int。運算值在編譯的時候就出結果,所以可以用來定義陣列維數。include...
突發奇想的strlen和sizeof的區別
一 sizeof sizeof 是運算子,在標頭檔案中typedef為unsigned int,其值在編譯時即計算好了,引數可以是陣列 指標 型別 物件 函式等。它的功能是 獲得保證能容納實現所建立的最大物件的位元組大小。由於在編譯時計算,因此sizeof不能用來返回動態分配的記憶體空間的大小。實際...
sizeof運算子和strlen函式的區別
1 sizeof是運算子,而strlen是函式。2 sizeof操作符的運算結果為size t,他在標頭檔案中的typedef為unsigned int。該型別保證能容納所操作物件的最大位元組大小。3 sizeof可以用型別做引數,而strlen只能用char 做引數,且必須是以 0 結尾。4 陣列...