2011-09-09 3 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

Googleに「sizeofを変数に適用しましたか?最初の2つの結果(そのうちの1つはStackOverflowのものです)があなたの質問に答えることができました。 –

+0

はい、両方の 'sizeof'式は同じ値を返します。 2番目のものはかっこを必要としないことに注意してください。 'sizeof'は演算子であり、関数ではありません。しかし '%u'は' size_t'ではなく 'unsigned int'型の引数を必要とします。これを書いてください: 'printf("%zu%zu \ n "、sizeof(struct foo)、sizeof f);またはこれ:' printf( "%lu%lu \ n"、(unsigned long)sizeof(struct foo) 、(unsigned long)sizeof); '。 '%zu'はC99特有の機能です。あなたのシステムの 'printf'はそれをサポートしていません。 –

答えて

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を使用することをお勧めします。これにより、コードはより型に依存しなくなります。これは常に良いことです。型名は宣言にほかにはありません。

関連する問題