2

重複の可能性:
Cで範囲外の配列インデックス
ローカル変数のメモリにそのスコープ外でアクセスできますか?
C範囲外エラーなし

このコードスニペットを試していますが、

#include <stdio.h>

main(){
int a[2],i;
a[5] = 12;
for(i=0;i<10;i++){
    printf("%d\n", a[i]);
}
return 0;
}

それは私に出力を与えます:

1053988144
32767
0
3
0
12
-1267323827
32716
0
0

なぜa[5]にアクセスできるのですか?ランタイムエラーを介してそれをすべきではありませんか?

4

3 に答える 3

5

Cには境界チェックがないので、配列アクセスをチェックするべきではありません。多くの場合、オペレーティングシステムやコンピューター自体が抗議し、何らかの例外が発生する可能性がありますが、想像できるすべての(仮想)アドレスを読み取ろうとすることを妨げるものは何もありません。「できる」(コンパイルして実行すると、悪影響がないように見える)からといって、プログラムが有効である、または「機能する」という意味ではないことに注意してください。無効なメモリアクセスの結果は未定義の動作です。

于 2012-07-06T13:02:39.627 に答える
4

int a[2];「メモリを割り当てる」という意味2 * sizeof(int)です

a[5]はの構文糖衣で*(a + 5)あり、メモリの領域を指しますa + (5 * sizeof(int))。したがって3 * sizeof(int)、配列の終わりを過ぎます。それはどこですか?知るか?

一部の言語は境界チェックを実行します。同様に実行できるCコンパイラーについて聞いたことがありますが、ほとんどはそうではありません。境界チェックをしてみませんか?パフォーマンス。そして、パフォーマンスは、そもそもCを使用する主な理由です。しかし、それは問題ありません。Cプログラマーは優れたプログラマーであり、配列の境界を超えることは決してないからです。(うまくいけば)

于 2012-07-06T13:08:15.583 に答える
1

インデックス境界の制御は実行されません。これは単にCが機能する方法です。

于 2012-07-06T13:03:44.963 に答える