1

char のサイズは 1 バイトで、ウィキペディアには次のように書かれています。

sizeof は、型を表すのに必要なバイト数で測定された、任意のデータ型のサイズを計算するために使用されます。

ただし、0..10に11 バイトを格納できますが、格納すると10 バイトになります。誰かがこの動作を説明できますか?unsigned char array[10]sizeof(array)

注: int データ型でこれを試してみました。sizeof(array) は 40 でしたが、44 になると予想されます。

4

3 に答える 3

18

ただし、unsigned char配列に11バイト格納できます[10]

いいえ、できません: 10 は の有効なインデックスではありませんarray[10]。配列には、ゼロからサイズマイナス 1 までのインデックスが付けられます。

C99規格による

6.5.3.4.3 [ operator is] が, , または, (またはその修飾バージョン)sizeof型を持つオペランドに適用されると、結果は 1 になります。charunsigned charsigned char

そのため、すべての標準準拠プラットフォームで結果が 10 になります。

于 2013-08-04T23:57:40.603 に答える
7

いいえ、有効なインデックスは0-9notになります。要素は notで0-10格納されるため、 の結果は正しいです。インデックスを超えてアクセスすると、範囲外および未定義の動作になります。 の関連セクションは、ポインター演算をカバーしています。1011sizeof9C99 draft standard6.5.6/8

[...] ポインター オペランドと結果の両方が同じ配列オブジェクトの要素を指している場合、または配列オブジェクトの最後の要素の 1 つ後ろを指している場合、評価はオーバーフローを生成しません。それ以外の場合、動作は未定義です。結果が配列オブジェクトの最後の要素の 1 つ後ろを指している場合、評価される単項 * 演算子のオペランドとして使用されません。

明示的に述べているC++標準とは異なり、C標準array has N elements numbered 0 to N-1の同様のステートメントの例を掘り下げる必要があるようです。C99 draft standardセクション6.5.2.1/4の例は次のとおりです。

int x[3][5];

そして、次のように述べています。

ここで、x は 3 x 5 の int 配列です。より正確には、x は 3 つの要素オブジェクトの配列であり、それぞれが 5 つの int の配列です。

于 2013-08-04T23:58:44.563 に答える
1
unsigned char array[10];/*Array of 10 elements*/

つまり

array[0],array[1],array[2],array[3].......array[9]

そうsizeof(array)=10です。

于 2013-08-05T04:25:06.753 に答える