Sizeof與Strlen的區別與聯絡

2021-06-18 23:50:32 字數 2727 閱讀 3982

【幾個例子】

例子1:

char* ss = "0123456789";

sizeof(ss) //4, ss是指向字串常量的字元指標

strlen(ss) //10, 只能用它獲得這個字串的長度

char ss = "0123456789";

sizeof(ss) //11, ss是陣列,計算到『\0』位置,因此是10+1

strlen(ss) //10, strlen是個函式內部實現是用乙個迴圈計算到\0為止之前

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『結尾

例子2:

class x

;x x;

cout<

例子3:

char szpath[max_path]

如果在函式內這樣定義,那麼sizeof(szpath)將會是max_path,但是將szpath作為虛參宣告時(void fun(char szpath[max_path])),sizeof(szpath)卻會是4(指標大小),即如果運算元是函式中的陣列形參或函式型別的形參,sizeof給出其指標的大小。

【sizeof與strlen區別總結】

1.sizeof是運算子,strlen是函式。

2. strlen是有效字串的長度,不包含『\0』,與初始化有關係,而sizeof與初不初始化沒有關係

3.sizeof可以用型別做引數,用來計算型別佔記憶體大小,strlen只能用char*做引數,且必須是以'\0'結尾的,用來計算字串的長度;

4.陣列做sizeof的引數不退化,傳遞給strlen就退化為指標了。

5. sizeof在編譯時計算,而strlen的結果在執行時才能計算出來,

【課堂測試】

1. 如下程式的輸出是什麼?(在intel x86(32-bit) platform.)

#include #include#includeint main( )

答:4/1/0, 如果不加memset(),第三行就會打出15(隨機數),請問這是為什麼?memset函式是初始化分配的記憶體空間,使用0、0x00都是0即』\0',不同系統當分配一塊記憶體時,這塊記憶體中的內容是未知的,系統只是根據申請者的要求為其化一塊記憶體並不管他原先的內容是什麼(有的系統清零),所以你的是隨即數15。

2.你能夠正確的說出它們的sizeof和strlen的大小嗎?

#include

#include#include
int main( )

; char str4[8]=;

printf("sizeof(str1)=%d\n",sizeof(str1));

printf("sizeof(str2)=%d\n",sizeof(str2));

printf("sizeof(str3)=%d\n",sizeof(str3));

printf("sizeof(str4)=%d\n",sizeof(str4));

printf("strlen(str1)=%d\n",strlen(str1));

printf("strlen(str2)=%d\n",strlen(str2));

printf("strlen(str3)=%d\n",strlen(str3));

printf("strlen(str4)=%d\n",strlen(str4));

exit(0);

}

答:sizeof是計算括號中變數的型別所佔的儲存空間(不考慮內容);strlen是計算變數值為起點的記憶體位址到第乙個'\0'的距離,以位元組為單位,字串尾部為'\0',0=='\0'(不包括』\0』)。正確答案是:4、6、8、8;5、5、1、9;

3. 你能夠正確的說出它們的sizeof和strlen的大小嗎?

char *str1="absde";

char str2="absde";

char str3[8]=;

char str4[8]=;

答案: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) 出錯

strlen(str4)有可能為不小於8的其他數字,取決於記憶體中的資料,因為strlen是計算變數值為起點的記憶體位址到第乙個'\0'的距離,但'\0'出現位置我們是未知的。

sizeof求位元組以及與strlen的區別

例子一 根據以下條件進行計算 1 結構體的大小等於結構體內最大成員大小的整數倍 2 結構體內的成員的首位址相對於結構體首位址的偏移量是其型別大小的整數倍,比如說double型成員相對於結構體的首位址的位址 偏移量應該是8的倍數。include include using namespace std ...

C語言中的strlen與sizeof的區別

sizeof與strlen是有著本質的區別,sizeof是求資料型別所佔的空間大小,而strlen是求字串的長度,字串以 0結尾。區別如下 1 sizeof是乙個c語言中的乙個單目運算子,而strlen是乙個函式,用來計算字串的長度。2 sizeof求的是資料型別所佔空間的大小,而strlen是求字...

C語言中的strlen與sizeof的區別

sizeof與strlen是有著本質的區別,sizeof是求資料型別所佔的空間大小,而strlen是求字串的長度,字串以 0結尾。區別如下 1 sizeof是乙個c語言中的乙個單目運算子,而strlen是乙個函式,用來計算字串的長度。2 sizeof求的是資料型別所佔空間的大小,而strlen是求字...