關於sizeof()函數

千萬不要把數組名看成指針,儘管有些時候他們是相通的,但也僅限某些時候而已。
sizeof是一個奇特的函數,告訴你你也許不相信——sizeof在編譯的時候就已經確定sizeof的結果了,這有點類似於宏。

char str[] = “Hello” ; sizeof (str ) = 6 
編譯器編譯的時候根據上下文完全知道str是一個數組,sizeof (str ) = 6 理所當然是在求數組所佔字節數,這個字節數在編譯期間就可以確定(數組的大小必須在編譯前指定好,C語言規定)

void *p = malloc( 100 ); sizeof ( p ) = 4 
編譯器看到p是個指針,可是誰能保證指針所指內存的大小呢?儘管你這裏寫着100,但是malloc可是動態分配,沒人敢保證malloc一定返回100個字節,甚至比如你不調用malloc,調用一個自己寫的函數,編譯器總之是無法在編譯期間就確定指針所指內存大小的,而sizeof又必須在編譯期間知道結果,那好,sizeof只好返回指針本身所佔內存的大小,32位機上是4個字節,64位機上是8個字節。

void Func ( char str[100]) 
  {   sizeof( str ) = 4   } 
數組作爲參數時,編譯器在編譯期間一律編譯爲指針,這樣儘管你定義str爲數組,實際上在編譯器眼裏後等同於:
void Func ( char * str) 
  {   sizeof( str ) = 4   } 
記住,數組作爲參數時,一律被編譯器編譯爲指針。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章