2011-09-09 77 views
6

考慮下面的代碼片段:的sizeof()應用於結構和可變

struct foo { 
    int a; 
    int b; 
    int c; 
}; 

struct foo f; 
printf("%u, %u\n", sizeof(struct foo), sizeof(f)); 

的代碼返回相同的數值,但如果的sizeof()適用於可變我想知道是否正確,或這僅僅是巧合嗎?

謝謝。

+0

你試過谷歌搜索「sizeof applied to variable」嗎?前兩個結果(其中一個來自StackOverflow)將能夠回答你的問題。 –

+0

是的,'sizeof'表達式都返回相同的值。請注意,第二個不需要括號; 'sizeof'是一個運算符,而不是一個函數。但'%u'需要'unsigned int'類型的參數,而不是'size_t'。寫這個:'printf(「%lu%lu \ n」,(unsigned long)sizeof(struct foo)); printf(「%zu%zu \ n」,sizeof(struct foo),sizeof f) ,(unsigned long)sizeof f);'。 '%zu'是C99特有的功能;你的系統的'printf' mignt不支持它。 –

回答

6

兩者都會和應該確實返回相同的值。

從MSDN:

sizeof運算符
sizeof運算符給出的存儲量,以字節爲單位來存儲操作數的類型的對象必需的。該操作員可以避免在程序中指定與機器相關的數據大小。

sizeof unary-expression 
sizeof (type-name) 
1

這與預期的一樣,即兩者將返回相同的值。該值在編譯時計算。

sizeof中使用變量通常是一種很好的做法,因爲您稍後可能會更改類型,因此大小也可能會發生變化。

0

一般來說,最好將它應用於變量。如果變量的類型改變,它將保持正確。

+0

這種方式的缺點是,如果將變量的類型從「只是結構」更改爲「指向結構的指針」,那麼sizeof(變量)將變爲4(或8取決於體系結構),編譯器會高興地接受它,警告。 – ivanzoid

5

sizeof適用於類型表達式。當您將其應用於某個類型時,()sizeof語法的一部分:sizeof(type)。當您將它應用於表達式()不屬於sizeof語法的一部分:sizeof expression

因此,您的第二個sizeof不是真正「適用於變量」。它適用於表達式(f)。該表達式由包含在冗餘對()中的單個變量f組成。您也可以不使用冗餘對(),而只使用sizeof f

sizeof應用於表達式時,它返回表達式結果的大小(即表達式所具有的類型的大小)。在你的例子中,兩個應用程序sizeof保證評估爲相同的值。

實際上,一個很好的編程習慣是儘可能地避免sizeof(type),即傾向於使用sizeof expression。這使得你的代碼更加獨立於類型,這總是一件好事。類型名稱屬於聲明而不屬於其他地方。