-2

私は何か他のことを試みていましたが、突然この無限ループに行き詰まりました。以下の for ループで何が起こっているのかを説明した回答を提案してください

#include<stdio.h>

int main()
{
 int x=0;
 int i;
 int array[5];
 for(i=0;i<=5;i++)
 {
  array[i]=x;
  printf("#%d value set in index %d\n",x,i);
 }

 return 0;
}

ループ=状態で符号を外すと正常に動作します。for

しかし、これを置くと、無限ループに陥ります。なぜですか?配列内の余分な要素 (制限を超える) にアクセスすると、未定義の動作になりますか? どんな助けでも大歓迎です。前もって感謝します。

4

6 に答える 6

5

5 のスペースを持つ配列に 6 つの int を書き込んでいます。6 番目の書き込みは配列の境界の外にあるため、その効果は予測できません。sizeof(int)あなたの場合、スタックの次のバイトに書き込みます。iこれは、 0 にリセットされるループ カウンタに使用されるメモリです。

あなたの質問で言うように、これを修正するには<=、 for ループの終了条件を に置き換えます<

于 2012-10-22T11:00:26.950 に答える
2

このようなエラーを簡単に引き起こさないようにするために、for実際の (ローカル) 配列に対してループを記述するための 2 つの適切なルールを次に示します。

  1. C の配列は 0 ベースであるため、反復はインデックス 0 から始まります。
  2. <を常に使用してください。決して<=
  3. サイズを繰り返さないでください。コンパイラに を使用して計算させsizeof array / sizeof *arrayます。第 2 項のアスタリスクに注意してください。

したがって、このループは次のように記述されているはずです。

for(i = 0; i < sizeof array / sizeof *array; i++)

そして、あなたは安全だったでしょう。

これは、サイズが見える「実際の」配列に対してのみ機能することに注意してください。配列をsizeofポインターに「折りたたむ」と、機能しません。

sizeofまた、 は関数ではないことに注意してください。したがって、()このような場合、引数の前後に s は必要ありません。

于 2012-10-22T11:09:55.693 に答える
2

の場合、未定義の動作が発生しi==5ます。array有効なインデックスがあります0..4- C の配列は 0 ベースです。

に置き換える<=<、有効なインデックスを反復処理します。

配列内の余分な要素 (制限を超える) にアクセスすると、未定義の動作になりますか?

はい。

于 2012-10-22T10:59:40.110 に答える
2

この特定のケースで無限ループに入る理由は、実際には非常に簡単に理解できます。スタック上のアドレスを見てください。

int main( ) 
{
    int x = 0;
    int i;
    int array[5];
    printf("&x = %#x, &i = %#x, array = %#x, array+4 = %#x\n", &x, &i, array, array+4);

この結果はprintf()、変数のアドレスと配列の開始と終了を示します。

&x = 0xbfac9cec, &i = 0xbfac9ce8, array = 0xbfac9cd4, array+4 = 0xbfac9ce4

したがって、スタックは次のようになります。

 var        address
***********************
array[0]    0xbfac9cd4
array[1]    0xbfac9cd8
array[2]    0xbfac9cdc
array[3]    0xbfac9ce0
array[4]    0xbfac9ce4
  i         0xbfac9ce8
  x         0xbfac9cec

現在、ループは 0 ~ 5 (6 要素) を書き込んでいます。配列には 5 つの要素しかないため、実際には 6 番目に書き込むとスタック上の次のものが上書きされますi。この場合です。これにより、次の行が作成されます。

array[i]=x;

これを書くのと同じ:

i = x;

それは0(あなたの場合)をiに保存し、ループを再開するので、それが永遠にループし、「インデックス0に保存された0」を出力し、次に「インデックス1」、2、3、4を再起動しますもう一度設定するとi=x;

于 2012-10-22T12:19:50.527 に答える
1

サイズ 5 の配列に 6 つの int 値を格納しようとしていますが、これは違法です。

したがって、配列の 6 番目の位置に書き込もうとすると、 (0 である)iの値で変数に書き込んでいます。が 0 であるxため、次の反復では、ループで指定された条件より小さくなります。これにより、ループが何度も何度も実行されます!ifor

于 2012-10-22T11:20:45.047 に答える
0

配列には5つの要素があるため、forループは0から4になるはずです

#include<stdio.h>

int main()
{
 int x=0;
 int i;
 int array[5];
 for(i=0;i<5;i++)
 {
  array[i]=x;
  printf("#%d value set in index %d\n",x,i);
 }

 return 0;
}
于 2012-10-22T11:00:31.843 に答える