sizeof和strlen的區別總結

一、sizeof的概念 
  sizeof是C語言的一種單目操作符,如C語言的其他操作符++、--等。它並不是函數。sizeof操作

符以字節形式給出了其操作數的存儲大小。操作數可以是一個表達式或括在括號內的類型名。操作數

的存儲大小由操作數的類型決定。 

二、sizeof的使用方法 
  1、用於數據類型 

  sizeof使用形式:sizeof(type) 

  數據類型必須用括號括住。如sizeof(int)。 

  2、用於變量 

  sizeof使用形式:sizeof(var_name)或sizeof var_name 

  變量名可以不用括號括住。如sizeof (var_name),sizeof var_name等都是正確形式。帶括號

的用法更普遍,大多數程序員採用這種形式。 

  注意:sizeof操作符不能用於函數類型,不完全類型或位字段。不完全類型指具有未知存儲大小

的數據類型,如未知存儲大小的數組類型、未知內容的結構或聯合類型、void類型等。 

  如sizeof(max)若此時變量max定義爲int max(),sizeof(char_v) 若此時char_v定義爲char 

char_v [MAX]且MAX未知,sizeof(void)都不是正確形式。 

三、sizeof的結果 
  sizeof操作符的結果類型是size_t,它在頭文件中typedef爲unsigned int類型。該類型保證能

容納實現所建立的最大對象的字節大小。 

  1、若操作數具有類型char、unsigned char或signed char,其結果等於1。 

  ANSI C正式規定字符類型爲1字節。 

  2、int、unsigned int 、short int、unsigned short 、long int 、unsigned long

 、float、double、long double類型的sizeof 在ANSI C中沒有具體規定,大小依賴於實現,一

般可能分別爲2、2、2、2、4、4、4、8、10。 

  3、當操作數是指針時,sizeof依賴於編譯器。例如Microsoft C/C++7.0中,near類指針字節數

爲2,far、huge類指針字節數爲4。一般Unix的指針字節數爲4。 

  4、當操作數具有數組類型時,其結果是數組的總字節數。 

  5、聯合類型操作數的sizeof是其最大字節成員的字節數。結構類型操作數的sizeof是這種類型

對象的總字節數,包括任何墊補在內。 

  讓我們看如下結構: 

  struct {char b; double x;} a; 

  在某些機器上sizeof(a)=12,而一般sizeof(char)+ sizeof(double)=9。 

  這是因爲編譯器在考慮對齊問題時,在結構中插入空位以控制各成員對象的地址對齊。如double

類型的結構成員x要放在被4整除的地址。 

  6、如果操作數是函數中的數組形參或函數類型的形參,sizeof給出其指針的大小。 

四、sizeof與其他操作符的關係 
  sizeof的優先級爲2級,比/、%等3級運算符優先級高。它可以與其他操作符一起組成表達式。如

i*sizeof(int);其中i爲int類型變量。 

五、sizeof的主要用途 
  1、sizeof操作符的一個主要用途是與存儲分配和I/O系統那樣的例程進行通信。例如: 

  void *malloc(size_t size), 

  size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream)。 

  2、sizeof的另一個的主要用途是計算數組中元素的個數。例如: 

  void * memset(void * s,int c,sizeof(s))。 

六、建議 
  由於操作數的字節數在實現時可能出現變化,建議在涉及到操作數字節大小時用ziseof來代替常

量計算。

深入理解sizeof

一、好首先看看sizeof和strlen在MSDN上的定義:

首先看一MSDN上如何對sizeof進行定義的:
sizeof Operator

sizeof expression

The sizeof keyword gives the amount of storage, in bytes, associated with a variable or

a type
(including aggregate types). This keyword returns a value of type size_t.

The expression is either an identifier or a type-cast expression (a type specifier

enclosed in
parentheses).

When applied to a structure type or variable, sizeof returns the actual size, which may

include
padding bytes inserted for alignment. When applied to a statically dimensioned array,

sizeof
returns the size of the entire array. The sizeof operator cannot return the size of

dynamically
allocated arrays or external arrays.
然後再看一下對strlen是如何定義的:

strlen

Get the length of a string.

Routine Required Header:
strlen

size_t strlen( const char *string );
Parameter
string:Null-terminated string
Libraries
All versions of the C run-time libraries.

Return Value
Each of these functions returns the number of characters in string, excluding the

terminal
NULL. No return value is reserved to indicate an error.

Remarks
Each of these functions returns the number of characters in string, not including the
terminating null character. wcslen is a wide-character version of strlen; the argument

of
wcslen is a wide-character string. wcslen and strlen behave identically otherwise.

二、由幾個例子說開去。

第一個例子:
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;
cout<cout<
第三個例子:
char szPath[MAX_PATH]

  如果在函數內這樣定義,那麼sizeof(szPath)將會是MAX_PATH,但是將szPath作爲虛參聲明時(

void fun(char szPath[MAX_PATH])),sizeof(szPath)卻會是4(指針大小)

三、sizeof深入理解。
1.sizeof操作符的結果類型是size_t,它在頭文件中typedef爲unsigned int類型。該類型保證能容

納實現所建立的最大對象的字節大小。
2.sizeof是算符,strlen是函數。
3.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的結果要在運行的時候才能計算出來,編譯時用來計算字符串的長度,不是類型佔內存的大小。
7.sizeof後如果是類型必須加括弧,如果是變量名可以不加括弧。這是因爲sizeof是個操作符不是個

函數。
8.當適用了於一個結構類型時或變量, sizeof 返回實際的大小, 當適用一靜態地空間數組,

sizeof 歸還全部數組的尺 寸。 sizeof 操作符不能返回動態地被分派了的數組或外部的數組的尺寸
9.數組作爲參數傳給函數時傳的是指針而不是數組,傳遞的是數組的首地址,如:
fun(char [8])
fun(char [])

都等價於 fun(char *) 在C++裏傳遞數組永遠都是傳遞指向數組首元素的指針,編譯器不知道數組的

大小如果想在函數內知道數組的大小, 需要這樣做:進入函數後用memcpy拷貝出來,長度由另一個

形參傳進去
fun(unsiged char *p1, int len)
{
unsigned char* buf = new unsigned char[len+1]
memcpy(buf, p1, len);
}

有關內容見: C++ PRIMER?
10.計算結構變量的大小就必須討論數據對齊問題。爲了CPU存取的速度最快(這同CPU取數操作有關

,詳細的介紹可以參考一些計算機原理方面的書),C++在處理數據時經常把結構變量中的成員的大

小按照4或8的倍數計算,這就叫數據對齊(data alignment)。這樣做可能會浪費一些內存,但理論

上速度快了。當然這樣的設置會在讀寫一些別的應用程序生成的數據文件或交換數據時帶來不便。MS

VC++中的對齊設定,有時候sizeof得到的與實際不等。一般在VC++中加上#pragma pack(n)的設定即

可.或者如果要按字節存儲,而不進行數據對齊,可以在Options對話框中修改Advanced compiler頁

中的Data alignment爲按字節對齊。
11.sizeof操作符不能用於函數類型,不完全類型或位字段。不完全類型指具有未知存儲大小的數據

類型,如未知存儲大小的數組類型、未知內容的結構或聯合類型、void類型等。如sizeof(max)若此

時變量max定義爲int max(),sizeof(char_v) 若此時char_v定義爲char char_v [MAX]且MAX未知

,sizeof(void)都不是正確形式
四、結束語

sizeof使用場合。
1.sizeof操作符的一個主要用途是與存儲分配和I/O系統那樣的例程進行通信。例如: 
  void *malloc(size_t size), 
  size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream)。

2.用它可以看看一類型的對象在內存中所佔的單元字節。
void * memset(void * s,int c,sizeof(s))

3.在動態分配一對象時,可以讓系統知道要分配多少內存。
4.便於一些類型的擴充,在windows中就有很多結構內型就有一個專用的字段是用來放該類型的字節大

小。
5.由於操作數的字節數在實現時可能出現變化,建議在涉及到操作數字節大小時用sizeof來代替常量

計算。
6.如果操作數是函數中的數組形參或函數類型的形參,sizeof給出其指針的大小。

注意:

sizeof是運算符 當編譯器編譯時 會自動運算這個變晨的大小的 並使用它的大小代替sizeof的值

int len = sizeof(int);
編譯時 編譯器計算出int的大小 大小爲4 所以把上面這句變成
int len = 4

偶用到 sizeof 和 strlen 的時候,通常是計算字符串數組的長度
看了上面的詳細解釋,發現兩者的使用還是有區別的,從這個例子可以看得很清楚:

char str[20]="0123456789";
int a=strlen(str); //a=10; >>>> strlen 計算字符串的長度,以結束符 0x00 爲字符串結束。
int b=sizeof(str); //而b=20; >>>> sizeof 計算的則是分配的數組 str[20] 所佔的內存空間的大

小,不受裏面存儲的內容改變。

strlen計算的是字符串的長度
sizeof計算的是變量使用的內存大小

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章