下面是網上的一個比較經典的例子,分析一下:
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,所以返回的值是一個不確定的值。