2010-12-04 3 views
3

長さNの配列を宣言しました。ここでは、ループを使用してこの配列の要素にいくつかの値を割り当てます(ループ変数は配列のインデックスとして使用されます)。次のようにコードは次のとおりです。配列インデックス変数がC、C++で0にリセットされます

int main() 
{ 
    int arr[4], j; 
    for(j=0; j<10; j++) 
    {  
    printf("%d\n", j); 
    arr[j] = 0; 
    sleep(1); 
    printf("%d\n\n", j); 
    } 
return 0; 
} 

私は0 1 2 ... 9ように出力を期待しかし、何が実際に起こったことはjが0にリセットされてしまったということであったとき、[N + 2] = 0(ARRの[ARR割り当て6] = 0、この場合)が実行されました。 ここで実際に何が起こっていますか?何か不足していますか?

答えて

8

あなたの配列には4つの要素があり、インデックスが範囲外です。単にメモリをストンプするだけです。ここでのコードを考える

、私はarr[4]は、アレイをリセットするために期待していますが、それは長さNのだとN+2がそれを引き起こすものであると述べたことから、あなたのスタック内のいくつかのパディングがあるかもしれません。いずれにしても、配列を宣言すると、jがスタックに配置されます。あなたの場合、jは、あなたのインデックスが範囲外であるときに、jのメモリにアクセスするような位置にあります。

+0

ここでストンプするのはどういう意味ですか? – nitzs

+0

今すぐ入手します。ありがとう。 – nitzs

+0

私は答えを更新しました。基本的にarr [N]は、配列の先頭へのポインタにNを追加し、メモリの参照を解除するのと同じことです。 arrの長さが小さいかどうかは気にしません。これはチェックするまでです。範囲外の配列要素に割り当てるとすぐに、メモリ上でストンプしています。すべてのベットはオフになっています。プログラムがクラッシュしたり、ミサイルを発射したり、jをリセットしたり、放射能レベルを上げたり、遠心分離機を制御から外したりする可能性があります。 –

3

コードの動作はバグがあるため、未定義です。 arrのサイズは4ですが、このサイズを超えてインデックス番号を付けています。

2

配列がオーバーフローしています。

int arr[4] 

ただし、10個の要素を割り当てようとしています。

jは、配列の直後にあるように見えるので、arr[6] = 0を割り当てると、jがクリアされます。

+0

それは私のことです。私はコンパイラや言語の動力学については知らないが、推測しなければならないのは、配列の後の最初のメモリ位置にJが作成されると仮定して、arr [4]に書き込むとjを書く。 – Nicholas

+0

しかし、配列の最後の要素を超えて最初のメモリ位置を逆参照することは合法ではありませんか?私はこの場所が予約されているという意味ですか? – nitzs

+1

「違法」とは、契約の邪魔になった場合、コンパイラはもはや入札に拘束されなくなります。それはそれ自身の主人になり、悪魔はあなたの鼻孔を持ちます。 –

関連する問題