2

重複の可能性:
C の負の配列インデックス?

これが意図したとおりにコンパイルされ、実行されるのはなぜですか? よくわかりません。どうなるのだろうと思っていたのですが、驚いたことに。出来た。

#include <stdio.h>
#include <conio.h>
int main(void)
{
    int i;
    int array[5];
    for(i = -1; i > -6; i--)
        array[i] = i*-1;
    for(i = -1; i > -6; i--)
        printf("%d\n",array[i]);
    getch();
}
4

3 に答える 3

6

あなたが不運だったので、それはうまくいきました。何が起こるかは未定義です。

array[x] 

と同等です

*(array+x)

xしたがって、基本的に の後の位置にあるポインターを逆参照していますarray。あなたの場合xは負なので、配列の前にメモリにアクセスしています。動作することは保証されていません。

それがコンパイルされるという事実は自然であり、有効な構文であり、整形式のプログラムです。コンパイラは、診断を生成する必要はありません (ただし、生成される場合があります)。

于 2012-09-27T08:14:28.290 に答える
2

それは機能しますが、それはただの運です。

配列はポインタであり、宣言すると、メモリが割り当てられます(たとえば、位置1から位置6)。次に、配列は最初の要素を指します。インデックスを増やすと、tiはポインタを前方に移動します。

あなたの場合、あなたはポインターを間違った側に動かしています。しかし、Cはそれをまったく気にせず、そのデータをそのメモリブロックに書き込みます。次に、そのデータを取得できます。

プログラムに割り当てられていないメモリブロックから読み取ると、すべてが発生する可能性があるため、注意してください。何か問題が発生するという意味ではありませんが、発生する可能性があります。だから、それを避けてください。

犯罪を犯していると考えてください。逮捕されるわけではありませんが、リスクがあります。

于 2012-09-27T08:16:56.750 に答える
0

C は、配列の境界チェックを提供しません。したがって、メモリに書き込み、後で読み取るだけです。メモリのこの部分は今回は触れられていないので、期待値が見つかります。

于 2012-09-27T08:15:01.343 に答える