C語言中的strlen與sizeof的區別
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
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,所以返回的值是一個不確定的值。