2017-03-13 8 views
-5

なぜ私のコードにエラーがありますか?C++なぜ新しい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 *y ; 
y = new int[5]; 
cout << "if no error, then this command should be run" << endl; 

が、出力は次のとおりです。

Process exited after 0.07883 seconds with return value 3221226356

Press any key to continue . . .

+8

'新しいint型を見つけるように

x = new int [7]; 

[5]'と '7を割り当てます'値......どこに問題がありますか???? ;) – LPs

+4

C++には境界チェックがありません。境界から外れると*未定義の動作につながります*。物語の終わり。 –

答えて

6

コードを書く前に、一瞬のためのロジックを考えます。 5intsのスペースを割り当て、次に10(または5つの要素を超えたもの)をすぐに持ち歩くことができれば、最初に何かを割り振るのは何ですか?

ここに表示されているのは、メモリオーバーランで、これはundefined behaviorです。 しないでください。

具体的には、0-based indexing systemで、上記の場合の有効なインデックスは0〜4であり、それを超えるものはUBを呼び出すバウンドメモリからアクセスすることになります。

2

あなたはそれが動作することを期待しないのはなぜ7.

を保存しようとし、その後5つの整数を割り当てますか?

2

あなたはxのみにアクセスすることができる長さのアレイ5

の5及び6位置にアクセスすることができない[0]、X [1]、X [2]、X [3]とX [4]ポジション。

アレイは、n個の位置である場合は、最初の位置は0

1

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

関連する問題