1. 程式人生 > >sizeof()與strlen()的區別

sizeof()與strlen()的區別

sizeof()用於檢視變數所佔的空間。例如:

sizeof(int) // 4

sizeof(float)// 4

sizeof(double)//8

sizeof(char) //1

char * p = new char[20];sizeof(p)//這裡是p指標所佔的空間故為4

char * p = "google";sizeof(p);//這裡是p指標指向字串常量,但sizeof()的結果仍然為4

char *p [20];//這時sizeof()為80 = 20 × 4

char p[20];sizeof(p);//這裡的結果為20 = 20 × 1

sizeof()使用了編譯器生成的符號表的緣故。編譯器的符號表類似於下面的形式,將所有的變數和其型別都記錄在表中。

變數 型別 大小

p char 10----------(陣列)

a char 1

b double 8

d point4

當要sizeof(變數)時,sizeof就會查取符號表。如果是單一型別的變數就會直接輸出此型別變數的所佔大小。並且也可以同時知道這個變數是否是陣列。

但是Class型別稍稍有些不同,以下程式碼:

class A
{
public:
int a;
int b;
private:
int c;
protected:
char d;
double x;
};

sizeof(A)//24.為什麼不是 3*4+1+8 = 21? 因為編譯器要做優化,所以採用的是4Byte一體,也就符合我們常說的32位機的原理。也就是機器的cpu可以同時處理32位二進位制。所以地址線也做成了32位方便傳輸。編譯器就將A優化為24Byte.但這只是對於32位機器有效。Vista等支援64位機器。所以以後的VS2008等高階版本可能要將這個優化為可以被8B整除的位元組數。

在字元表中,編譯器大概會如此儲存:類名 分隔符 變數名,這樣即保證變數不會重名,又可以知道是那個類中的變數。

A::a int 4

A::b int4

A::c int 4

A::d char 1

A::xdouble 8

當呼叫sizeof(A)的時候,編譯器會去尋找A類的所有變數,相加後如果不能被4整除,將變為最接近的4的倍數。

strlen()用於返回字串的長度。但是不包括最後的'/0'

char * p = "google"; strlen(p);//結果為6

char * p = new char [20]; strlen(p)//???這裡結果不能確定,原因是不知道何處有'/0',strlen是查詢到'/0'結束

strlen()函式的大概寫法:

int strlen(const char * strSrc)
{
if(strSrc == NULL)
throw "NULL point...";
int i = 0;
while(*strSrc++!='/0')
i++;
return i;
}