• ベストアンサー

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

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

  • ポインタを引数に渡してメモリ領域をとる

    C++でアプリケーションを作っています。 メモリ領域を動的に確保するコードを書いているところなのですが、 int *pr; // ポインタ kakuho(pr,100); // 新たにメモリ領域int100個分確保し、先頭番地をprに返す関数 というコードを作りたいのですが、 kakuho(int *pr,int num){ pr=new int[num]; return; } このようなプログラムを書いてVisual C++.NETでコンパイルすると、コンパイルは成功するのですが、実行時に Run-Time Check Failure #3 - The variable 'pr' is being used without being defined. このメッセージの意図することがよくつかめぬまま、ここで開発が止まっています。 どういう意味なのか、また、解決するにはどのようにしたらよいか教えてください。

  • メモリ領域を

    char s[65536]; char s0[65536]; と大きなWindowsプログラムの中で宣言するとプログラムのコンパイルはとおり実行もほとんど問題ないのですが メインウィンドウのサイズ変更をしようとするとエラーになります そこで char s[999]; char s0[999]; と宣言を変更すると全く問題無く動きます メモリ領域を大きく使えるような設定とかあるのでしょうか? OSはWin98でコンパイラはBorland C++5.51でAPIかつ非統合環境で組んでいます

  • c言語のメモリリークについての質問

    c言語のメモリリークについての質問 c言語初心者のため、メモリリークについて質問させていただければと存じます。 下記のコードで、 char* char_p = "char1"; char_p = "char2"; // ←メモリリーク? 2行目の部分は、 "char1"のメモリ領域が確保されたままで、解放できなくなってしまうので、 メモリリークを起こして問題な気がするのですが、実際はどうなのでしょうか? よろしくお願いいたします。

  • 動的メモリ利用の目的

    情報分野を学習中の大学生です。 C言語の動的メモリ利用について質問させて頂きます。 先日、基数ソートを実装している際に、動的メモリを利用しました。 ソートデータ数の都合上(最大10桁100万個)、確保すべきバッファ領域が膨大だったためです。 ※実際に必要だったバッファ:buf[0][0] - buf[9][1000000-1] ここで私が動的メモリを利用した動機は「バッファ領域でかすぎるからメモリ圧迫するし動的メモリのほうがいいかな?」といったものです。 コードを書いているうちに、この認識の正誤と、どういったケースで動的メモリを扱うべきか気になりました。 御回答宜しくお願いします。

  • C言語のメモリ領域確保

    ポインタ変数ををmain関数で宣言し、関数test()にて必要分だけ領域確保してそのアドレスをmain関数のポインタ変数に渡して利用することは可能でしょうか。 (サイズのわからないテキストデータを、十分に大きな配列に入れるのではなく、関数でメモリを動的確保して無駄の無い配列に入れたい等) C言語ではやはり無理で、構造体のリストにするのが一番でしょうか。 初歩的なことで申し訳ありませんがどなたかお願いいたします。

  • c言語のメモリの確保について

    c言語で変数を宣言したり、領域を確保したりする場合に、メモリ上のこのアドレスに領域を確保する、といったように場所を指定することはできるのでしょうか?

  • 動的なメモリ領域の確保

    double型変数5個分のメモリをmalloc関数により確保し,その確保した要素のアドレスを表示するように,プログラムを作る問題で、 (注)に「 %pで表示するためには,double型へのポインタ(double *)をvoid型へのポインタ(void *)にキャストする必要がある.」と書かれていたのですが、どういうことでしょうか? 以下のようでいいのでしょうか? #include<stdio.h> #include<stdlib.h> #define COUNT 5           // 動的に確保するメモリ領域数を示すマクロ定数の定義 int main(void) {  // 動的に確保するメモリ領域のアドレスを保持するポインタ変数の宣言  double * pointer;  int i;                  // for文で使用する変数の宣言  // int型変数5個分のメモリ領域を確保  pointer = (double *)malloc(sizeof(double) * COUNT);  if(pointer == NULL) {        // メモリ領域の確保が失敗した場合   printf("メモリ領域を確保できませんでした.\n");   exit(1);                // プログラムの終了  }  for(i = 0; i < COUNT; i++)   printf("%d番目のアドレスは%pです.\n", i + 1, pointer + i);  free(pointer);            // 確保したメモリ領域の解放  return 0; }

  • メモリ領域確保に関して

    C言語を始めて3ヶ月の初心者です。 下記のような定義で、領域確保をしたいのですが、 うまい方法がわかりません。 ご存知の方いらっしゃいましたら、 御知恵をお貸し下さいませんでしょうか? <test.h> ================================== #define SIZE_A (5) /* 親構造体 */ typedef struct { int testInt; testSmallStructT *testSmall; // 7バイト構造体の配列 char *testChar; // SIZE_A分の領域*配列数 } testBigStructT; /* 7バイト構造体 */ typedef struct { char str1[3]; char str2[4]; } testSmallStructT; /* メンバ変数 */ testBigStructT gTest[10]; ================================== ここで、あらかじめ全体の領域サイズを算出して、 mallocにてエリア確保を行う方法を求めてます。 また、多数にmallocを使用するとメモリ確保失敗時に、 それまで確保したエリアの開放を行わなくてはいけなくなる懸念から、 できるだけ使用しないようにしたいのです。 メンバ変数gTestを10の配列で持ち、構造体testBigStructTの、 要素testSmallとtestCharを可変の配列として扱いたくポインタ定義をしており、 更に、testCharにSIZE_A(5byte)の領域を確保しようとしております。 最終的には、下記のような使い方をしたいのですが、 メモリ確保の方法がわかりません。 =================================== (EX:) strcpy(gTest[0].testSmall[0].str1,"aaa"); strcpy(gTest[3].testSmall[2].str2,"bbb"); strcpy(gTest[6].testChar[3],"cccc"); =================================== 開放は下記の記述で問題ないと思っております。 free(gTest); 大変申し訳御座いませんが、 ご指摘・ご指導願いませんでしょうか? どうか宜しくお願い致します。

  • システム領域で起こるメモリリーク

    メモリリークを起こしているのはシステム領域で、ユーザ領域は正常です。 処理の概要はディレクトリパスをDBから取得(Pro*C)し、そのディレクトリ内のファイルを削除(remove関数)するです。 Cの関数でシステム領域のメモリを確保するものはあるのでしょうか?ご存知の方がおられるなら回答お願いします。

  • アセンブラでのメモリの動的確保について

    自作コンパイラのために最近NASMを使ってアセンブラの勉強を始めたものです。 メモリ領域の確保のためにNASMでは buffer: resb 64 と宣言しますが、C++でのchar* buffer=new char[size]; のような、動的なメモリ領域の確保の記述は可能でしょうか? 普段はC++を主に使っているため、見当違いな質問かもしれませんが、よろしくお願いします。