兩者區別如下:
sizeof操作符的結果型別是size_t, 它在標頭檔案中的typedef是unsigned int型別。該型別保證能容納實現所建立的最大物件的位元組大小。
sizeof是運算子,而strlen是函式。
看乙個問題,
int** ar[3][4],陣列ar佔據多大空間?
因為二維陣列裡放的是二級指標,每乙個是4位元組,所以sizeof(ar) = 3*4*4 = 48.
sizeof可以用型別做引數,strlen只能用char*做引數,且必須是以「\0」結尾的。sizeof還可以用函式做引數。
比如:
short f();
printf("%d\n",sizeof(f()));
輸出結果是sizeof(short),即2.
4.陣列做sizeof的引數不退化,傳遞給strlen就退化為指標。
5.大部分編譯程式在編譯時期就把sizeof計算過了,是型別或是變數的長度。
這也就是sizeof(x)可以用來定義陣列維數的原因:
char
str[20] = "0123456789";
int a = strlen(str);// a = 10
int b = sizeof(str);// 而b = 20
6.strlen 的結果要在執行時才能計算出來,這裡是計算字串的長度,而不是型別佔記憶體的大小。
8.當使用乙個結構型別或變數時,sizeof返回實際的大小。當使用以靜態的空間陣列時,sizeof返回全部陣列的大小。sizeof操作符不能返回被動態分配的陣列或外部的陣列的大小。
sizeof計算棧中分配的大小,對於static變數是不會計算在內的,因為static變數是存放在全域性資料區。
9.陣列作為引數傳給函式時傳的時指標而不是陣列,傳遞的是陣列的首位址,
如fun(char[8]),fun(char )都等價於fun(char *)。
在c++中傳遞陣列永遠都是傳遞指向陣列首元素的指標,編譯器不知道陣列的大小。如果想在函式內知道陣列的大小,需要這樣做:進入函式後用memcpy函式將陣列拷貝出來,長度由另乙個形參傳入。
**如下:
fun(unsigned
char *p1, int len)
10.sizeof操作符不能用於函式型別,不完全型別或位字段。不完全型別是指具有未知儲存大小資料的資料型別,如未知儲存大小的陣列型別,未知內容的結構或聯合體,void型別等。
11.計算結構變數的大小需要提到資料對齊的問題。
資料對齊:c++在處理資料時經常把結構變數中成員的大小照4或8的倍數計算。
這樣做,可能會浪費一些記憶體,但在理論上cpu速度快了。當然這樣的設定會在讀一些應用程式生成的資料檔案或交換資料帶來不便。
vc++中的對齊設定,有時候sizeof得到的與實際不等。一般在vc++中加上#pragma pack(n)的設定即可。
或者如果要按位元組儲存,而不進行資料對齊,可以在option–》advanced compiler —》data alignment改為按位元組對齊。
資料:《面試寶典》
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是求字...