3

私はこのCコードスニペットを持っています

int numbers[4]={1};

numbers[0]=1; numbers[1]=2; numbers[3]=3; numbers[10]=4;
printf("numbers: %d %d %d %d %d %d\n",numbers[0],numbers[1],numbers[3],numbers[6],numbers[10],  numbers[5]) ;

このスニペットの出力は次を生成します。

    numbers: 1 2 3 963180397 4 0

いくつか質問があります

  1. numbers[10] を設定すると、配列のサイズがちょうど 4 であるため、エラーが発生しません。

  2. numbers[6] を印刷するとガベージ値が返されるのに対し、numbers[5] は 0 の値が返されるのはなぜですか? それもガベージ値であってはなりません。

  3. numbers[10] を設定すると、配列のサイズが増加しないことがわかっていますが、その場合はどうなりますか?

前もって感謝します 。PS i は GCC を使用してコードをコンパイルしました!!

4

3 に答える 3

2
  1. これでエラーが発生することはありません。配列はスタックで宣言されているため、number [10]はアドレス番号+(10 * sizeof int)で書き込み、そこにあるものをすべて上書きします。
  2. Xymostechが言ったように、0は963180397と同じくらいゴミになる可能性があります。numbers[6]を出力すると、アドレス番号+(6 * sizeof int)に格納されているものが出力されるため、以前にローカル変数を宣言したことがある場合は、プログラムのコンパイル方法によって異なります。後の番号などの
  3. 回答1を参照してください。

あなたができることはこれです:

int empty[100];
int numbers[4]={1};
int empty2[100];

memset(empty, 0xCC, sizeof empty);
memset(empty2, 0xDD, sizeof empty2);

numbers[0]=1;numbers[1]=2;numbers[3]=3;numbers[10]=4;
printf("numbers: %d %d %d %d %d %d\n",numbers[0],numbers[1],numbers[3],numbers[6],numbers[10],  numbers[5]) ;

これで、数値配列からアクセスするときに何を上書きしているかを理解できます

于 2012-12-07T22:38:42.163 に答える
1

あなたの質問に答えるには:

  1. 必ずしも。配列を静的に宣言した場合、またはスタック上の配列の後に続くものを上書きした場合、コンパイラはより大きなチャンクでメモリを予約できます。
  2. これはコンパイラに依存し、「未定義動作」に該当します。
  3. (数値+ 10)を等号の後の値に設定します。
于 2012-12-07T22:38:32.160 に答える
0

ポインター演算に減衰するため、エラーは発生しません。

あなたが書くときnumbers[10]numbers + 10 * sizeof(numbers)それはかなり正しいです。

意図されていない (割り当てられていない) メモリにアクセスすることは未定義の動作であるため、アクセスする範囲外のすべてのインデックスはガベージであり、0.

あなたが言ったように、4より大きいインデックスにアクセスしても配列のサイズは増加しません。また、何もしません。

于 2012-12-07T22:44:01.070 に答える