Why make new int is error
あるので、だからあなたは位置のn-1までアクセスすることができmake new int
は何も問題はありません。問題は、宣言時の配列のサイズにあります。
はの瞬間のためにあなたのコードを見てみましょう:
int *x ;
x = new int[5];
x[0] = 3;
x[1] = 4;
x[2] = 5;
x[3] = 1;
x[4] = 2;
x[5] = 11;
x[6] = 90;
- あなたが最初の行にポインタをint型の変数を宣言することから始めます。
- 次にを正確にに5つの連続する空白を割り当て、
x
は最初のものを指します。
- 次に、5ブロックのメモリに値を割り当てます.0から始まり4までの値が有効です。0-4は5ブロックのメモリで、メモリに初期値で割り当てられています。
- 次に、x [5]に11を、x [6]に90を格納しようとします。これは未定義の動作が発生する場所です。
あなたの配列で指定されたインデックスの外に移動しようとすると、コンパイラは最初にメモリ内に固定数のスペースしか割り当てていないので、プログラムはそうでなければならないメモリにアクセスしようとしています。コンパイラがインデックス0〜4の配列のメモリしか割り当てていないため、x[4]
がメモリに格納された直後に来るメモリスペースが何であれ、何もわからない場合があります。x[5]
は空で、プログラムの隙間マシンの他のプロセスで使用されている可能性があり、そのアクセスを許可しないと、セグメンテーション違反が発生する可能性があります。
これは、定義されていない動作と呼ばれる理由です。最初に宣言された配列サイズの外にある配列インデックスが、空であるか空でないメモリ空間を指している場合があります。空の場合、プログラムは実行され続けます(これは間違っています)。でなければでなければ、ランタイムエラーのためにプログラムが終了します。この問題を解決するには
は、にあなたの配列のサイズを変更:コンパイラはメモリの7つの連続するスペースの代わりに、5
'新しいint型を見つけるように
[5]'と '7を割り当てます'値......どこに問題がありますか???? ;) – LPs
C++には境界チェックがありません。境界から外れると*未定義の動作につながります*。物語の終わり。 –