天天看點

C語言中sizeof與strlen 的差別

sizeof與strlen是有着本質的差別,sizeof是求資料類型所占的空間大小,而strlen是求字元串的長度,字元串以/0結尾。總的來說sizeof把'\0'也給數上了,而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("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)); ==>4 6 這裡的4是char*c占的空間

printf("%d%d/n",sizeof(d),strlen(d)); ==>7 6 這裡的7是因為 sizeof把'\0'也給數了

printf("%d%d/n",sizeof(e),strlen(e)); ==>6 14 因為沒有遇到'\0',strlen根本沒停下

分析一下:

第一行定義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,是以傳回的值是一個不确定的值。

插一個我寫的程式

逆置一個字元串

非遞歸

#define _crt_secure_no_warnings 1

#include<stdio.h>

#include<stdlib.h>

void reverse_string(char*str, int len)

{

int left = 0;

int right = len;

char tmp = 0;

while (left <= right)

tmp= str[left];

str[left] =str[right];

str[right]=tmp;

left++;

right--;

}

int main()

char str[] = "abcdef";

int len = sizeof(str) / sizeof(str[0]) - 2;

//這裡本來想着是減一,結果老是運作不出來,因為sizeof(str) 它的結果是7,而不是6

reverse_string(str, len);

printf("%s\n", str);

system("pause");

return 0;

繼續閱讀