2016-12-26 7 views
-3

配列のインデックスよりも大きい配列のインデックスにアクセスした場合、実行時エラーが発生する可能性があります。しかし、実行してゼロを出力するのはうれしいようです。このコンパイラ固有のものかOS固有のものか配列のサイズよりも大きい配列インデックスにアクセスすると、いくつかの異なる環境でランタイムエラーが発生しますか?配列のインデックスが配列のサイズよりも大きい場合

たとえば、その境界外の配列にアクセスする

int foo[5]; 
cout << foo[5] << endl; 


vector<int> bar(5); 
cout << bar[5] << endl; 
+6

未定義の動作は... –

+0

[未定義の動作linky on SO](http://stackoverflow.com/a/1239977/620908) - [nasal demons](http://catb.org/ jargon/html/N/nasal-demons.html) –

答えて

1

それは、C++でのランタイムエラーではありません:それは未定義の動作だし、何が何も含まない、発生する可能性があることを意味します。

C++には、「ランタイムエラー天使」はなく、「未定義の動作デーモン」のみです。

1

あなたが提供したコードは、未定義の動作の古典的な例です。

ランタイムエラーの原因となる配列のサイズよりも大きい配列インデックスにアクセスした場合、私はいつも考えていましたか?

ベクトルクラス.at(size_type pos)方法は、境界チェックを実行し、posコンテナの範囲内にない場合std::out_of_rangeをスロー。

vector#at documentation

0

それはプログラムがクラッシュすることが動的配列である場合には、読み取りまたは配列の境界を超えて書き込みをしようとして未定義の動作です。

char c1[] = "123"; 
char c2[2] = "A"; // ok c2[0] = 'A', c2[1] = '\0'; 

cout << c1 << endl; // 123 ok 
cout << c2 << endl; // A ok 

c2[5] = 'M'; // writing to the out bound of the array 

cout << c1 << endl; // 1M3 ??!! 
cout << c2 << endl; // A ok 

ここでメモリドングルが発生します。

関連する問題