C語言中的strlen與sizeof的區別

鴨脖發表於2013-10-12

sizeof與strlen是有著本質的區別,sizeof是求資料型別所佔的空間大小,而strlen是求字串的長度,字串以/0結尾。區別如下:

(1) sizeof是一個C語言中的一個單目運算子,而strlen是一個函式,用來計算字串的長度。

(2)sizeof求的是資料型別所佔空間的大小,而strlen是求字串的長度

例項1:

printf("char=%d/n",sizeof(char));  //1
printf("char*=%d/n",sizeof(char*)); //4
printf("int=%d/n",sizeof(int)); //4
printf("int*=%d/n",sizeof(int*)); //4
printf("long=%d/n",sizeof(long)); //4
printf("long*=%d/n",sizeof(long*)); //4
printf("double=%d/n",sizeof(double)); //8
printf("double*=%d/n",sizeof(double*)); //4

 

可以看到,char佔1個位元組,int佔4個位元組,long點4個位元組,而double佔8個位元組。但 char*,int*,long*,double*都佔4個位元組的空間。

這是為什麼呢?

在C語言中,char,int,long,double這些基本資料型別的長度是由編譯器本身決定的。而char*,int*,long*,double*這些都是指標,回想一下,指標就是地址呀,所以裡面放的都是地址,而地址的長度當前是由地址匯流排的位數決定的,現在的計算機一般都是32位的地址匯流排,也就佔4個位元組。

 

 例項2:

char a[]="hello";

char b[]={'h','e','l','l','o'};

 strlen(a),strlen(b)的值分別是多少?

 

前面分析過,strlen是求字串的長度,字串有個預設的結束符/0,這個結束符是在定義字串的時候系統自動加上去的,就像定義陣列a一樣。陣列a定義了一個字串,陣列b定義了一個字元陣列。因此,strlen(a)=5,而strlen(b)的長度就不確定的,因為strlen找不到結束符。

 

下面是網上的一個比較經典的例子,分析一下:

 

char *c="abcdef";

char d[]="abcdef";

char e[]={'a','b','c','d','e','f'};

 

printf("%d%d/n",sizeof(c),strlen(c));

printf("%d%d/n",sizeof(d),strlen(d));

 

printf("%d%d/n",sizeof(e),strlen(e));

 

輸出的結果是:

4 6

7 6

6 14

 

 

分析一下:

第一行定義c為一個字元指標變數,指向常量字串,c裡面存放的是字串的首地址。

第二行定義d為一個字元陣列,以字串的形式給這個字元陣列賦值。

第三行定義的也是個字元陣列,以單個元素的形式賦值。

 

當以字串賦值時,"abcdef",結尾自動加一個"/0".

 strlen(c)遇到/0就會結束,求的是字串的長度,為6.

 sizeof(c)求的是型別空間大小,在前面說過,指標型所點的空間大小是4個位元組,系統地址匯流排長度為32位時。

 

strlen(d)也是一樣,字串賦值,自動新增/0,求字串的長度當然是6.

sizeof(d)是求這個陣列所佔空間的大小,即陣列所佔記憶體空間的位元組數,應該為7.

 

sizeof(e), 陣列e以單個元素賦值,沒有/0結束符,所以所佔空間的大小為6個位元組。

strlen(e),去找/0結尾的字串的長度,由於找不到/0,所以返回的值是一個不確定的值。

相關文章