1

私はAC初心者で、問題があります(いつものように)。私はこの簡単なプログラムを書きました:

 #include <stdio.h>
 #define SIZE 10

 main()
 {
    int vettore[9];
    int contatore1,contatore2;

    for(contatore1 = 0; contatore1 <= 9; ++contatore1)
    {
        vettore[contatore1] = contatore1*2;
    }

    printf("%d\n\n", vettore[9]);

    for(contatore2 = 0; contatore2 < 10; ++contatore2)
    {
        printf("%d\n", vettore[contatore2]);
    }

    printf("\n%d\n", vettore[9]);

    return 0;
}

このプログラムの出力は次のとおりです。

18

0
2
4
6
8
10
12
14
16
9

10

vettore[9] の値が 3 回変わるのはなぜですか? そして、出力の最初の行にのみ正しい値があるのはなぜですか? ありがとうございました :)

4

5 に答える 5

5

C 配列は 0 ベースなので、9 要素配列の有効なインデックスは [0..8] です。配列の終わりを超えて書いています。これにより、未定義の結果が得られますが、次のスタック変数が破損する可能性があります。

より詳細には、... をvettore使用してアクセスできる 9 つの要素があります。最初のループの最後の繰り返しで、. これは、配列の終わりを超えてメモリにアクセスします。これにより、未定義の動作が発生します (つまり、C 標準では期待される結果がここで指定されていません) が、 のアドレスが のアドレスと同じである可能性が高く、後者の変数が書き込まれることを意味します。vettore[0]vettore[8]vettore[9]vettore[9]contatore2

含まれているよりも多くの要素を出力する次のループにも同様の問題がありvettoreます。

ループを次のように変更することでこれを修正できます

for(contatore1 = 0; contatore1 < 9; ++contatore1)
for(contatore2 = 0; contatore2 < 9; ++contatore2)

sizeof(vettore)/sizeof(vettore[0])ハードコーディングの代わりにループの終了テストで使用して、代わりに配列のサイズを計算するように変更した方が安全であることに注意してください9

于 2013-01-31T09:16:27.130 に答える
1

配列vettoreには 9 つの要素がvettore[9]ありますが、 を参照することで、実際には10 番目の要素を参照しています (要素のインデックスは 0 から始まるため)。したがって、適切に定義された値のない、スタック上のランダムな場所です。

解決策は、最大 までのインデックスを作成するか、サイズが 10 になるようにvettore[8]定義することです。vettore

于 2013-01-31T09:19:22.570 に答える
0

vettoreあなたが定義したサイズは9

int vettore[9];

ループでは、totil から開始する0ため、(配列のサイズ) ではなく、配列の要素で9遊んでいます。109

サイズで配列を定義する必要があります10

int vettore[10];
于 2013-01-31T09:18:17.047 に答える