2017-10-13 16 views
0

iは、配列A [10]といくつかの他の変数コアダンプが、GDBはその正確な場所

を持っているそして、あなたが実行したとき、私はそう

for(int i=0;i<20;i++) //intentionally 20 
    A[i]=0; 

として、それを初期化していますと言うことができます見つけることができませんこのライブラリ、それはエラーなしで配列を初期化し、アクセスも可能ですが、gdbは他の場所でコアダンプを与えます(私の場合は、他の変数のメモリが変更されています)
なぜ与えられないのですか?配列の初期化中のコアダンプ

+0

外出すると、ときどきうまくいくように見えるかもしれない[*未定義の動作*](http://en.cppreference.com/w/cpp/language/ub)それはしない)。あなたがUBを持っているなら、プログラムの残りの部分の振る舞いについて推測することはありません。 –

+0

このような問題を見つける方法については、メモリデバッガ(例:[Valgrind](http://valgrind.org/)など)を使用することを検討してください。 GCCには、実行時に境界チェックを追加するオプションがあると思います。 –

+1

gccとclangを使用すると境界検査にアドレスサニタイザを使うことができます:オプションをコンパイルするには '-fsanitize = address'を、リンクオプションには '-lasan'を追加する必要があると思います。 –

答えて

3

IN c/C++では、配列の範囲外の実行が保護されていないため、プロセスに属していないメモリにアクセスするとクラッシュが発生します。 あなたが限界を越えて、他の変数のように自分のメモリをスタックやヒープに書き出している限り...プログラムはクラッシュしませんが、他の変数は変更されます。ポインタがあるランダムなメモリアドレスを指しているので、将来のクラッシュが発生する可能性があります。

+1

埋め込みコードやカーネルコードを書くとき「プロセスに属していないメモリ」というようなものは存在しないので、決してアクセス違反を得ることはありません。 –

0

コンパイル時に生の配列などのPODのエラーチェックは実行時にのみ行われます。 undefined behaviourを呼び出しています。 C++のraw(Cスタイル)配列にはstd::vectorまたはstd::arrayが好ましいと言われています。

関連する問題