面試題:sizeof與strlen的區別
阿新 • • 發佈:2020-12-14
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”也會佔用一個字元長度的記憶體空間。