2016-04-25 8 views
0

私は、Visual Studio C++のスタンスに関する正式な説明を希望し、次のような配列を作成するとき、それが何をするか:ビジュアルスタジオでは、配列の範囲外にアクセスできますか? (VS2013)

int a[3] = {1, 2, 3}; 

を、あなたは、その後のようなものを実行します。

cout << a[4]; 

テストすると、そのメモリ位置に保存されているガベージが印刷されます。なぜプログラマはこれを行うことができますが、javaScriptのような言語はユーザがそうするのを妨げるのですか?

コンパイラにこの種の動作をC++のユーザーから禁止させないことによる一般的な考え方は何ですか?これはCから引き継がれたものなのでしょうか?

これは私が持っているほんのわずかな好奇心であり、おそらく答えた人がどこでそのような情報を見つけることができるか教えてくれるでしょう。何が起こっているのかについての答えは、それは私が興味理由だ、私が求めているものではありません。

ありがとうございます。

+0

なぜjavascriptタグを使用しますか? –

+0

@ NinaScholz私は私のコメントにjavascriptを言いました。あなたがそれを見たかどうかは分かりません。私は思っていた、多分私はまた、javaScriptの説明も取得します。いずれにせよ、私はzeromusのようなことをしてくれたので、タグを削除しました。 – user3499524

+1

哲学は、あなたが使っていないものを支払っていません。つまり、デベロッパーに境界チェックのコストを課すことなく、デベロッパーが必要と思った場合にデベロッパーが既にチェックしていると仮定します。そのようなチェックは、std :: arrayやstd :: vectorのような標準的なライブラリ構造に含まれています。あるいは、それらをデバッグビルドまたはリリースビルドのいずれかに持つように設定することもできます。 – Robinson

答えて

2

コンパイラとは関係ありませんが、言語はそのように定義されています。内容は不確定ですが、未定義の動作になります。 理由については

添字(配列インデックス)演算子の定義を考える許されています(ISO/IEC 14882から:2011(E)§5.2.1/ 1 [expr.sub]):

大括弧で囲まれた後置式は、後置式です。式の1つは、「へのポインタT」でなければならず、もう1つはスコープのない列挙型または整数型でなければなりません。結果はタイプ「T」の左辺値です。タイプ「T」は完全に定義されたオブジェクトタイプです。式E1[E2]起因上に何が起こる*((E1)+(E2))

に(定義により)同じ[重点鉱山]

アレイE1は、それがだ最初の要素(すなわち、へのポインタに減衰されることです&(E1)[0]に相当)、コンパイラは(E1)+(E2)でポインタ演算を行います。また、配列がポインタに壊れているので、境界チェックの可能性はありません。

関連する問題