2007年9月9日 星期日

辨別sizeof 和 strlen


可能這個是在C語言裡面比較基礎的問題了,但是很多情況下是經常
混淆的,必須下面的一組數據,你能夠正確的說出它們的sizeof和
strlen的大小嗎?

char *str1="absde";
char str2[]="absde";
char str3[8]={'a',};
char str4[8]={'a','b','s','e','f','g','h','j'};

其實你只要掌握了兩者的意義,就很容易解了,這種題目在筆試的
時候最容易出了。答案見下面:

sizeof(str1)=4;
sizeof(*str1)=1;
strlen(str1)=5;
sizeof(str2)=6;
strlen(str2)=5;
sizeof(str3)=8;
strlen(str3)=1;
sizeof(str4)=8;
strlen(str4)=13;
strlen(*str1)出錯
passing arg1 of 'strlen' makes pointer from integer
without a cast.

sizeof是計算括號中變量的類型所佔的儲存空間。
strlen(str4)有可能為不小於8的其他數字,取決於內存中的數據,

無論如何strlen()都是一個函數,它返回的是一個字符串的長度,
也就是說從你給的字符串首地址開始,一直到'\0'為止的這一段長度。
以字節為單位,字符串尾部

char* ss = "0123456789";
sizeof(ss)結果4 ===》ss是指向字符串常量的字符指針
sizeof(*ss)結果1 ===》*ss是第一個字符

char ss[] = "0123456789";
sizeof(ss)結果11 ===》ss是數組,計算到\0位置,因此是10+1
sizeof(*ss)結果1 ===》*ss是第一個字符

char ss[100] = "0123456789";
sizeof(ss)結果是100 ===》ss表示在內存中的大小100×1
strlen(ss)結果是10 ===》strlen是個函數內部實現是用
一個循環計算到\0為止之前

int ss[100] = "0123456789";
sizeof(ss)結果400 ===》ss表示再內存中的大小100×4
strlen(ss)錯誤===》strlen的參數只能是char*且必須是以''\0''結尾的

char q[]="abc";
char p[]="a\n";
sizeof(q),sizeof(p),strlen(q),strlen(p);
結果是4 3 3 2

class X
{
int i;
int j;
char k;
};
X x;
sizeof(X)=12 ===》內存補齊
sizeof(x)=12同上
sizeof操作符不能返回動態地被分派了的數組或外部的數組的尺寸