0

私はいくつかの基本的なポインター操作を試みていましたが、明確にしたい問題があります。これが私が参照しているコードスニペットです

    int arr[3] = {0};
*(arr+0) = 12;
*(arr+1) = 24;
*(arr+2) = 74;
*(arr+3) = 55;
cout<<*(arr+3)<<"\t"<<(long)(arr+3)<<endl;
//cout<<"Address of array arr : "<<arr<<endl;
cout<<(long)(arr+0)<<"\t"<<(long)(arr+1)<<"\t"<<(long)(arr+2)<<endl;;
for(int i=0;i<4;i++)
    cout<<*(arr+i)<<"\t"<<i<<"\t"<<(long)(arr+i)<<endl;
//*(arr+3) = 55;
cout<<*(arr+3)<<endl<<endl;

私の問題は次のとおりです。 for-loop の外で arr+3 にアクセスしようとすると、目的の値 55 が出力されます。しかし、for ループを介してアクセスしようとすると、別の値 (この場合は 3) が得られます。for ループの後、値が 4 として出力されます。何が起こっているのか説明してもらえますか? 前もって感謝します..

4

2 に答える 2

2

サイズ 3 の配列を作成し、4 番目の要素にアクセスしようとしています。したがって、結果は未定義です。

配列をスタックに割り当てるため、最初に 4 番目の要素を書き込もうとすると、実際にはスタックに割り当てられたスペースを超えて書き込んでいます。デバッグ モードではこれは機能しますが、リリースではおそらくプログラムがクラッシュします。

4 番目の場所の値を 2 回目に読み取ると、値 4 が読み取られます。コンパイラが変数 i の配列の後にスタック領域を割り当てているため、これは理にかなっています。ループの実行が終了すると、値は 4 になります。 .

于 2012-06-05T06:27:15.993 に答える
0

配列は 3 つの要素で定義されているため、データは 12、24、74 のように順番に格納されます。4 番目の要素に 55 を割り当てると、メモリ内の別の場所に格納され、順番に格納されません。最初は、コンパイラは正しく出力しますが、メモリを処理できないため、ガベージ値を出力します。

于 2012-06-05T06:29:57.323 に答える