1
#include <stdio.h>

int main(void) {

int TEST_HB[10]; 
memset(TEST_HB,'9', sizeof( TEST_HB));

printf("%c\n",TEST_HB[9]);

printf ("TEST_HB[10]=%d\n",sizeof( TEST_HB[40]));   // shows 4
printf ("Arraysize=%d\n",(sizeof(int)*10));     // gets the expectected results
return 0;

} 

sizeof (myArray) は、配列の合計サイズをバイト単位で返す必要があると思います。sizeof( TEST_HB[40])しかし、定義されていないのに 4 を返すのはなぜですか?

4

4 に答える 4

7

TEST_HB[40]型を持つ式です(また、配列に対して大きすぎるため、int評価された場合の動作は未定義です)。実装上の のサイズも同様です40。4が一般的です。sizeof(TEST_HB[40])int

重要なsizeofのは、VLA でない限り、オペランドを評価しないことです。型を使用するだけです。したがって、 のようなオブジェクトがなくても、コードで動作が定義されていますTEST_HB[40]

実際には、動作が定義されていると言いますが、 と出力されないsizeoftypesize_tに評価され%dます。使用%zu可能な場合は使用するか、コンパイラのドキュメントを参照してください。varargs 呼び出し規約に幸運があり、実装size_tと同じサイズintであるか、実装がリトルエンディアンであるか、またはその両方であるため、ここでは問題ありません。

sizeofオペランドを評価しない事実のかなり一般的な使用法は、次のように書くことです。

struct Foo *foo = malloc(sizeof(*foo) * number_of_foos_required);

sizeof(*foo)は と同じですsizeof(struct Foo)が、一部の人にとっては、使用するのに「明らかに」適切なサイズです。fooメモリが割り当てられる前に初期化されてsizeofいないため、 の値を実際に使用しないのも同様ですfoo

の動作を示すあまり一般的ではない使用法sizeof:

int i = 0;
printf("%d\n", i);
printf("%d\n", (int)(sizeof(i++))); // i++ is not executed
printf("%d\n", i);
于 2012-08-31T13:23:38.900 に答える
2
sizeof( TEST_HB)

は配列のサイズです (のサイズint[10])

sizeof(TEST_HB[40])

配列の要素のサイズ ( のサイズint) です。

要素は配列に存在しないことに注意してTEST_HB[40]ください (配列には 10 個の要素しかsizeofありません) が、そのオペランドを評価しないため、依然として有効です。

于 2012-08-31T13:24:46.670 に答える
1

sizeof演算子は、そのオペランドのサイズを返します。配列のサイズを取得したい場合は、sizeof TEST_HB代わりに使用する必要があります (括弧は必要ありません)。 TEST_HB[40]は確かに 型ですがintTEST_HBは 型int[10]です。可変長配列を除いて、演算子のオペランドはsizeof評価されないため、未定義の動作につながることはないことに注意してください。

C11 § 6.5.3.4 sizeof および _Alignof 演算子

このsizeof演算子は、そのオペランドのサイズ (バイト単位) を返します。これは、式または括弧で囲まれた型の名前の場合があります。

また、定数でない大文字の識別子を使用することは、悪い C プログラミング スタイルと見なされます。

于 2012-08-31T13:24:12.100 に答える
0

sizeof( TEST_HB[40])int 配列の位置 40 の int のサイズを返すため、サイズとして 4 バイトになります。

于 2012-08-31T13:25:36.330 に答える