strlen是函數,而sizeof是算符。strlen需要進行一次函數調用,而對於sizeof而言,因為緩沖區已經用已知字符串進行了初始化,起長度是固定的,所以sizeof在編譯時計算緩沖區的長度。
因為sizeof()測試的是數組的長度。而strlen測試的是字符串的長度。在定義數組時,字符串後面還有一個結束標志'\0',這個也要算進去!
#include <stdio.h>
#include <string.h>
main()
{
char ss[]="string";
printf("%d %d \n",sizeof(ss),strlen(ss));
}

代碼修改下:
#include <stdio.h>
#include <string.h>
main()
{
char ss[]="string";
ss[0]=0;
ss[1]='\0';
ss[2]='0';
printf("%d %d \n",sizeof(ss),strlen(ss));
}

聲明x的時候x裡面存儲的是"string\0",最後的\0是結束符,所以sizeof(x)就是7。 而\0的asccii碼值為0,strlen(x)是計算到\0位置,strlen(x)也就是0了。