1. 程式人生 > 其它 >面試題:sizeof與strlen的區別

面試題:sizeof與strlen的區別

技術標籤:C++字串c++

strlen的原始碼為:

_Check_return_ size_t  __cdecl strlen(_In_z_ const char * _Str);

sizeof與strlen的區別

1、sizeof計算的是分配的記憶體空間實際佔用的位元組數; strlen計算的是記憶體空間中字元的個數(不包括"\0")。

2、sizeof是運算子,引數可以是指標、陣列、型別、物件和函式; strlen是函式,引數必須是字元型指標(char*)。

3、sizeof是在編譯時計算,故引數為陣列名時計算的是整個陣列的佔用記憶體大小; strlen是在執行

時計算,引數為陣列名時,陣列會退化為指標。

sizeof、strlen使用分析

第一種情況,定義一個字元型指標指向一個字串:

#include<iostream>
using namespace std;

int main()
{
	char* str = "abcdabcd";
	cout << "sizeof(str)=" << sizeof(str) << endl;  //字元型指標str的記憶體大小
	cout << "sizeof(*str)=" <<
sizeof(*str) << endl; //指標str指向的第一個字元所佔記憶體大小 cout << "strlen(str)=" << strlen(str) << endl; //指標str指向的字串中字元的個數 system("pause"); return 0; }

執行結果:
在這裡插入圖片描述
第二種情況,定義一個不指定長度的字元型陣列:

#include<iostream>
using namespace std;

int main()
{
	char str[] = "abcdabcd"
; cout << "sizeof(str)=" << sizeof(str) << endl; //陣列str的記憶體大小 cout << "sizeof(*str)=" << sizeof(*str) << endl; //指標str指向的第一個字元所佔記憶體大小 cout << "strlen(str)=" << strlen(str) << endl; //指標str指向的字串中字元的個數 system("pause"); return 0; }

執行結果:
在這裡插入圖片描述
第三種情況,定義一個確定長度的字元型陣列:

#include<iostream>
using namespace std;

int main()
{
	char str[20] = "abcdabcd";
	cout << "sizeof(str)=" << sizeof(str) << endl;  //陣列str的記憶體大小
	cout << "sizeof(*str)=" << sizeof(*str) << endl; //指標str指向的第一個字元所佔記憶體大小
	cout << "strlen(str)=" << strlen(str) << endl;  //指標str指向的字串中字元的個數

	system("pause");
	return 0;
}

在這裡插入圖片描述
第一種情況的結果,相信大家都能理解。接下來,分析一下上述第二種、第三種情況的結果。第二種情況中,定義的是一個不確定長度的陣列,陣列中儲存著8個字元,對應著8個位元組的記憶體大小,為什麼sizeof(str)=9?這是因為,在C語言規定以“\0”為字串結束的標誌,其在記憶體中同樣佔有一個1個位元組的大小,因此陣列的記憶體大小為9個位元組。 而strlen表示的是結束符“\0”之前的字串的長度,陣列中有8個字元,因此strlen(str)=8。

第三種情況中,指定了陣列的長度為20,即編譯時就在記憶體中分配了20個字元的記憶體大小,對應為20個位元組,故sizeof(str)=20。在此要注意的一點是,定義確定長度的字元型陣列時,一定要保證陣列長度大於字串長度。原因也很簡單,字串的結束符“\0”也會佔用一個字元長度的記憶體空間。

對結構體sizeof