• ベストアンサー

不正なメモリ領域へのアクセスについて

C言語では、 確保されていないメモリ領域へアクセスするコードを書いても、コンパイルエラーが出ないので気をつける必要がある。 と言う記述がしばしば出てきます。 だったら、コンパイルエラーがでるように変更すれば良いじゃん。と単純に思ってしまうのですが、エラーが出ないようにしてあるメリットって何か有るのですか?

質問者が選んだベストアンサー

  • ベストアンサー
  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.2

まず、#1の方のように「検出不能」という理由が一つ。 もう一つは、効率。 「理屈ではおかしいコードだが、ちゃんと動くし実行効率がいい」 というプログラムを書けるように。 C言語は、極度に効率重視になっています。 誰が言い出したか「Cの精神」という言葉がありますが、 その中に「プログラマーを信頼する」「移植性が保証されなくても高い実行効率」 などがあります。 エラーを排除してしまうと、効率が悪くなるかもしれないからです。 その点、Javaの場合は、言語仕様が安全性に傾いています。 コンパイル時点で、ある程度エラーを検出してくれます。 どちらが良い悪いということではなく、思想の違いがあります。

mk1234
質問者

お礼

回答ありがとうございました。

その他の回答 (2)

noname#30727
noname#30727
回答No.3

C/C++は、OS、他の言語やランタイムを作るのにも使われます。メモリ管理を担う側がメモリアクセスの制限を受けてしまうと困る事があります。 一般的なアプリケーションを作成する場合にはエラーを出してくれるコンパイラがあってもよさそうですが、実行時に不正アクセスとなるような部分を完璧に検出するコンパイラを作成できたら、働かなくてもいいくらいの収入になるでしょう(笑

mk1234
質問者

お礼

回答ありがとうございました。

  • PAPA0427
  • ベストアンサー率22% (559/2488)
回答No.1

というか、検出不能なんです。 メモリの不正領域アクセスといっても、単純に変数エリアが初期化されてないケースがほとんどです。または実行時にとんでもないアドレスを計算で設定してしまうとかですね。 その場合、構文的にはOKですね。ライブラリで指定してるかもしれないし、インクルードファイルで定義してるのかもしれません。計算方法もチェックしなければなりませんね。 実際に実行させて見ないと、未定義がそうかは判らないです。

mk1234
質問者

お礼

回答ありがとうございました。

関連するQ&A