天天看點

strlen 和 sizeof 的差別

首先,讓我們先了解一些strlen和sizeof的定義 :

一、strlen

1、strlen所作的是一個計數器的工作,它從記憶體的某個位置(可以是字元串開頭,中間某個位置,甚至是某個不确定的記憶體區域)開始掃描,直到碰到第一個字元串結束符’\0’為止,然後傳回計數器值(長度不包含’\0’)。注:用char s[6] = “string”; 這種初始化方法時, 後面的常量字元串"string"占7位元組, 最後一個位元組為’\0’。如果你用char s[6] = {‘s’,‘t’,‘r’,‘i’,‘n’,‘g’};這種方式并不能将s初始化為一個字元串. 沒有以’\0‘結尾,’它隻是一個容納了char的數組. 隻有以’\0’結尾的char數組才能稱之為字元串.

2、strlen是一個函數。strlen(char*)函數求的是字元串的實際長度,它求得方法是從開始到遇到第一個’\0’,如果你隻定義沒有給它賦初值,這個結果是不定的,它會從aa首位址一直找下去,直到遇到’\0’停止。注:這裡需要特别注意,strlen求的是字元串實際長度。如 int a[ 5 ] ={1,2,3,4,5} strlen(a) //錯誤,數組a不是字元數組。

二、sizeof

1、在 C 語言中,sizeof() 是一個判斷資料類型或者表達式長度的運算符。sizeof是C/C++中的一個操作符(operator),簡單的說其作用就是傳回一個對象或者類型所占的記憶體位元組數。注:記住是記憶體位元組數,具體的資料類型對應具體的位元組數。

三、兩者的差別

樣例1:

#include

#include

using namespace std;

int main(void)

{

char aa[200]={’\0’};

cout<<strlen(aa)<<endl;

return 0;

}

/這個樣例結果為0而sizeof()傳回的是變量聲明後所占的記憶體數,不是實際長度,此外sizeof不是函數,僅僅是一個取位元組運算符,

strlen是函數。/

樣例2:

#include

#include

using namespace std;

int main(void)

{

char aa[200]=“Hello, World!”;

cout<<strlen(aa)<<endl;

return 0;

}

/這個樣例的結果為13(逗号後面有一個空格)/

樣例3:

#include

#include

using namespace std;

int main(void)

{

char aa[200]=“hello”;

cout << strlen(aa) << endl;

return 0;

}

//這個樣例的結果為5

sizeof(aa); //傳回200

int a[10];

sizeof(a)

//傳回40 (根據語言int型 c/c++由編譯器決定是兩個或四個 java 是四個)

1、對靜态數組的處理:

char str[20000]=“0123456789”;

int a=strlen(str); //a=10; >> strlen 計算字元串的長度,以結束符 0x00 為字元串結束。

int b=sizeof(str); //而b=20000; >> sizeof 計算的則是配置設定的數組 str[20000] 所占的記憶體空間的大小,不受裡面存儲的内容改變。

2、對指針的處理:

char* ss = “0123456789”;

sizeof(ss) //結果 4>>ss是指向字元串常量的字元指針,sizeof 獲得的是一個指針的值所占的空間,是char*類型,是以是4

sizeof(*ss) //結果 1>> *ss是第一個字元 其實就是獲得了字元串的第一位’0’ 所占的記憶體空間,是char類型的,占了 1 位

strlen(ss)= 10 //>> 如果要獲得這個字元串的長度,則一定要使用 strlen

//sizeof傳回對象所占用的位元組大小. 正确

//strlen傳回字元個數. 正确

在使用strlen時,有一個很特别的情況,就是數組名到指針蛻變

char Array[2000] = {‘0’};

sizeof(Array) == 2000;

char *p = Array;

strlen( p ) = 1; //結果為1

sizeof( p )= 4 //結果為4

//在傳遞一個數組名到一個函數中時,它會完全退化為一個指針

部分内容參考自百度百科

繼續閱讀