首先,strlen是函數,sizeof是運算操作符,二者得到的結果類型為size_t,即unsigned int類型。大部分編譯程序在編譯的時候就把sizeof計算過了,而strlen的結果要在運行的時候才能計算出來。
sizeof計算的是變量的大小,而strlen計算的是字符串的長度,前者不受字符’\0’影響,后者以’\0’作為長度判定依據。
對於以下語句:
int main() { char *str1 = "asdfgh"; char str2[] = "asdfgh"; char str3[8] = {'a', 's', 'd'}; char str4[] = "as\0df"; printf("sizeof(str1)=%d\n",sizeof(str1)); printf("strlen(str1)=%d\n",strlen(str1)); printf("sizeof(str2)=%d\n",sizeof(str2)); printf("strlen(str2)=%d\n",strlen(str2)); printf("sizeof(str3)=%d\n",sizeof(str3)); printf("strlen(str3)=%d\n",strlen(str3)); printf("sizeof(str4)=%d\n",sizeof(str4)); printf("strlen(str4)=%d\n",strlen(str4)); return 0; }
執行結果是:
sizeof(str1) = 4; strlen(str1) = 6; sizeof(str2) = 7; strlen(str2) = 6; sizeof(str3) = 8; strlen(str3) = 3; sizeof(str4) = 6; strlen(str4) = 2;
str1是字符指針變量,sizeof獲得的是該指針所占的地址空間,32位操作系統對應4字節,所以結果是4;strlen返回的是該字符串的長度,遇到’\0’結束,’\0’本身不計算在內,故結果是6。
str2是字符數組,大小由字符串常量”asdfgh”確定,sizeof獲得該數組所占內存空間大小,包括字符串結尾的’\0’,所以結果為7;strlen同理返回6。
str3也是字符數組,但大小確定為8,故sizeof得到的結果是8;strlen統計’\0’之前所有字符的個數,即為3;
str4是常量字符數組,sizeof得到字符總數即6;strlen計算至’\0’結束,因此返回2;
