sizeof與strlen的區別


兩者區別如下:

  1. sizeof操作符的結果類型是size_t, 它在頭文件中的typedef是unsigned int類型。該類型保證能容納實現所建立的最大對象的字節大小。

  2. sizeof是運算符,而strlen是函數。

    看一個問題,

         int** ar[3][4],數組ar佔據多大空間?
    

    因爲二維數組裏放的是二級指針,每一個是4字節,所以sizeof(ar) = 3*4*4 = 48.

  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 的結果要在運行時才能計算出來,這裏是計算字符串的長度,而不是類型佔內存的大小。

8.當使用一個結構類型或變量時,sizeof返回實際的大小。當使用以靜態的空間數組時,sizeof返回全部數組的大小。sizeof操作符不能返回被動態分配的數組或外部的數組的大小。

sizeof計算棧中分配的大小,對於static變量是不會計算在內的,因爲static變量是存放在全局數據區。

9.數組作爲參數傳給函數時傳的時指針而不是數組,傳遞的是數組的首地址,
如fun(char[8]),fun(char [])都等價於fun(char *)。

在C++中傳遞數組永遠都是傳遞指向數組首元素的指針,編譯器不知道數組的大小。如果想在函數內知道數組的大小,需要這樣做:進入函數後用memcpy函數將數組拷貝出來,長度由另一個形參傳入。

代碼如下:

fun(unsigned char *p1, int len)
{
    usigned char* buf = new unsigned char[len+1];
    memcpy(buf, p1, len);
}

10.sizeof操作符不能用於函數類型,不完全類型或位字段。不完全類型是指具有未知存儲大小數據的數據類型,如未知存儲大小的數組類型,未知內容的結構或聯合體,void類型等。

11.計算結構變量的大小需要提到數據對齊的問題。

數據對齊:C++在處理數據時經常把結構變量中成員的大小照4或8的倍數計算。

這樣做,可能會浪費一些內存,但在理論上CPU速度快了。當然這樣的設置會在讀一些應用程序生成的數據文件或交換數據帶來不便。
VC++中的對齊設定,有時候sizeof得到的與實際不等。一般在VC++中加上#pragma pack(n)的設定即可。
或者如果要按字節存儲,而不進行數據對齊,可以在Option–》Advanced Compiler —》Data Alignment改爲按字節對齊。


資料:《面試寶典》

發佈了40 篇原創文章 · 獲贊 6 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章