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;
}