關於sizeof和strlen經常容易搞混淆,特別是初學者。
先看一個關於sizeof的應用的實例:
寫出下面程序的答案:
答案:4,11,100,400,4,3,4,6,8,4,4
1、ss1是一個指針,指針的大小是一個定值,就是4.
2、ss2是一個字符數組,這個數組的出事大小未定,有具體的值來定。再加上字符串的是以'\0'結束的,所以sizeof(ss2)的大小爲11.
3、ss3是一個給定確定大小的數組,因爲是char型數組,所以其大小爲100*1;
4、ss4和ss3是一樣的,只是ss4是int型數組,其大小爲100*4;
5、q1、q2和ss2是一樣的,只是有一點要注意,'\n'是佔一個字節的。
6、q3和ss1是一樣的,q1是指針,其大小固定的。
7、A、B爲結構體,在默認情況下,爲了方便對結構體內元素的訪問和管理,結構體的長度一定是最長的數據元素的整數倍。
8、空結構體的大小爲1,空類的大小也爲1.
sizeof和strlen的兩者的區別:
1、sizeof操作符的類型是size_t,在頭文件定義爲unsigned int類型,
2、sizeof是關鍵子,strlen是函數
3、sizeof可以用作類型參數,strlen只能用char *做參數,且必須是以'\0'結尾的,sizeof還可以用函數做參數.
short f()
printf("%d\n",sizeof(f()));
4、數組做sizeof的參數不退化,傳遞給strlen就退化爲指針了。
5、大部分程序在編譯的時候就把sizeof計算過了,是類型或是變量的長度。
6、strlen的結果要在運行的時候才能計算出來,用來計算字符串的長度,而不是類型佔用的內存大小。
7、sizeof後如果是類型必須加括號,如果是變量名可以不加括號,這是因爲sizeof是操作符不是函數。
8、當使用了一個結構類型或變量時,sizeof返回實際的大小。當使用一個靜態空間數組時,sizeof返回全部數組的尺寸。sizeof操作符不能返回被動態分配的數組或外部的數組的尺寸。
9、數組作爲參數傳給函數時傳的是指針而不是數組,傳遞的是數組的首地址。在C++中,傳遞數組永遠都是傳遞指向數組首元素的指針,編譯器不知道數組的大小。如果要在函數內知道數組的大小,需要這樣做,進入函數後,調用memcpy將數組拷貝進來,長度由另一個參數傳進去。代碼如下:
fun (unsigned char *pl, int len)
{
unsigned char *buf = new unsigned char[len+1];
memcpy(buf,pl,len);
}
10、sizeof操作符不能用於函數類型、不完全類型或位字段。不完全類型指具有未知存儲大小數據的數據類型,如未知存儲大小的數組類型、未知內容的結構或聯合類型、void類型。
sizeof的使用場合:
1、sizeof操作符的一個主要用途是與存儲分配和IO系統那樣的例程進行通信。
2、用它可以看看某種類型的對象在內存中所佔的單元字節。
3、在動態分配內存時,可以讓系統知道要分配多少內存。
4、便於一些類型的擴充。
5、由於操作數的字節數在實現時可能出現變化,建議在涉及到操作數字節大小時用sizeof代替常量計算。
6、如果操作數是函數中的數組形參或函數類型的形參,sizeof給出氣指針的大小。