考慮下面的代碼片段:的sizeof()應用於結構和可變
struct foo {
int a;
int b;
int c;
};
struct foo f;
printf("%u, %u\n", sizeof(struct foo), sizeof(f));
的代碼返回相同的數值,但如果的sizeof()適用於可變我想知道是否正確,或這僅僅是巧合嗎?
謝謝。
考慮下面的代碼片段:的sizeof()應用於結構和可變
struct foo {
int a;
int b;
int c;
};
struct foo f;
printf("%u, %u\n", sizeof(struct foo), sizeof(f));
的代碼返回相同的數值,但如果的sizeof()適用於可變我想知道是否正確,或這僅僅是巧合嗎?
謝謝。
兩者都會和應該確實返回相同的值。
從MSDN:
sizeof運算符
sizeof運算符給出的存儲量,以字節爲單位來存儲操作數的類型的對象必需的。該操作員可以避免在程序中指定與機器相關的數據大小。
sizeof unary-expression
sizeof (type-name)
這與預期的一樣,即兩者將返回相同的值。該值在編譯時計算。
在sizeof
中使用變量通常是一種很好的做法,因爲您稍後可能會更改類型,因此大小也可能會發生變化。
一般來說,最好將它應用於變量。如果變量的類型改變,它將保持正確。
這種方式的缺點是,如果將變量的類型從「只是結構」更改爲「指向結構的指針」,那麼sizeof(變量)將變爲4(或8取決於體系結構),編譯器會高興地接受它,警告。 – ivanzoid
sizeof
適用於類型和表達式。當您將其應用於某個類型時,()
是sizeof
語法的一部分:sizeof(type)
。當您將它應用於表達式()
不屬於sizeof
語法的一部分:sizeof expression
。
因此,您的第二個sizeof
不是真正「適用於變量」。它適用於表達式(f)
。該表達式由包含在冗餘對()
中的單個變量f
組成。您也可以不使用冗餘對()
,而只使用sizeof f
。
當sizeof
應用於表達式時,它返回表達式結果的大小(即表達式所具有的類型的大小)。在你的例子中,兩個應用程序sizeof
保證評估爲相同的值。
實際上,一個很好的編程習慣是儘可能地避免sizeof(type)
,即傾向於使用sizeof expression
。這使得你的代碼更加獨立於類型,這總是一件好事。類型名稱屬於聲明而不屬於其他地方。
你試過谷歌搜索「sizeof applied to variable」嗎?前兩個結果(其中一個來自StackOverflow)將能夠回答你的問題。 –
是的,'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不支持它。 –