2011-01-07 8 views
0

sizeof data/sizeof *dataの論理をthis code行17で教えてください。 「配列の要素数」のための一般的なCのイディオムだCコードの行の論理

... 
unsigned char data[16]; 
... 
size = fread(data, sizeof *data, sizeof data/sizeof *data, file); 
... 

おかげ

答えて

5

は少しでも挑発的なので、配列の最初の要素は*dataなので、配列の合計サイズを最初の要素のサイズで割って、要素の数を与えます。

スタイルベースであろうと、配列として宣言された変数(最初の要素へのポインタとして渡されたものではなく、崩壊に依存します。 -pointerはまだ起こっていない)、またはC++コードでの破損シナリオの可能性があります。それは古いCコードでもよく見られます。

+0

配列であると想定されるものに '* data 'を使用しても、気になりません。私はむしろ '#define array_size(x)(sizeof(x)/ sizeof 0 [x])'を参照したいでしょう。(これは安全なマクロであり、C++でそれを使用すると、オーバーロードされた ' ] '演算子。) –

+0

Chrisは' sizeof x [0] 'ではありません。 – Eimantas

+0

どちらの方法でも実際に動作します。私はそれがアセンブリ言語のレジスタ索引記法からのホールドオーバーだと思う。 –

2

これは、配列の合計サイズを各要素の型のサイズで除算します。 配列の要素数を返します。

0

配列の要素数を返します。これは実行時の値ではなくコンパイル時の値なので、実際にはsizeof()の中のものは評価されません。これは、ポインタがヌルまたは境界外であっても機能するためです。

(楽しい事実:私は、WindowsのCランタイム、すでにまさにその_countof()マクロがあります、およびWindows SDKで、また同じことを行いARRAYSIZE()マクロがあります。)

0

それは単純に計算しています配列内の要素の数 - つまり、配列全体のサイズを配列の最初の要素のサイズで割った値は、要素の数を返します(配列内のすべての要素は同じサイズです)。

関連する問題