• ベストアンサー

allocってなんですか?

メモリ領域を確保するとかって言うことらしいのですが、 charとかintとかで定義するのとは違うのですか? charとかで定義した場合もメモリ領域は確保されていると思うのですが、 どこが違うのでしょうか? 違いが理解できません。 どなたか、詳しく教えてください。お願いします。

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

  • ベストアンサー
回答No.9

>例えばの場合のと申しますか、 >参考のソースを少し教えていただけませんか? プログラム実行時に初めて処理人数(ninzu)が判明するシステムで、データを読み込んで処理する関数 func() を考えてみます。便宜上データの型は int で言語はCとします。本当はエラー処理(メモリが足らない場合などの)が必要ですが省略します。 void func(int ninzu) {   int* pData;   int loop;   /* 人数分の int エリアを確保 */   pData = malloc(ninzu * sizeof(int));   /* 人数分の int データを読み込み */   for(loop = 0; loop < ninzu; loop ++)   {     *(pData + loop) = ReadData();   }   /*** 読みこんだデータを使って ***/   /*** なんらかの処理&出力   ***/ /* いらなくなったエリアを開放 */   free(pData); } 単純化して書くとこんな感じになります。実際にはポインタ pData は単純な int へのポインタではなく構造体へのポインタだったりすることになるでしょう。これだと本当に必要なメモリだけを使うことになり、しかも人数の変動にも対応できることになります。 >こいつは"出来るな"って思われるようになるわけですね。 >他のアプリのことも考えてのプログラムって事ですね。 そうなんですが、人間がコーディングしているのでCやC++で書かれた市販されているアプリケーションでもエリア解放を忘れてしまっているプログラムがよくあります。だから同じアプリを何度も起動、終了を繰り返すと解放されないメモリが蓄積されリソース不足になってしまうやつはそういったバグを持っているということがわかります。

coolguys
質問者

お礼

ありがとうございました。 大変分かりやすかったです。 解放忘れたりしているのが、リソース不足の原因にもなっているのですね。 気をつけなければ。 本当にありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (8)

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.8

> よく変数の寿命とか分からないので、 > みんなグローバルにしていたら、COBOLかよと > よく言われている私には苦手なトコです。 そんな、難しくないですよ。 自動変数の寿命は、変数を宣言しているところを直前で括っている中括弧の中に いる間、が、その変数の寿命です。 int xxx() {   int i;   for (i = 0 ; i < 10 ; ++i) {     int j;     ...     {       int k;       ...     } … kは、ここまで   } … jは、ここまで   return 0; } … iは、ここまで > みんなグローバルにしていたら、COBOLかよと 「って、COBOL やったことあるのかよ」と突っ込みを入れたくなりますよね。 今時は、COBOL を経験すること自体「まれ」ですもんね。 # といいつつも、COBOL のソースを読むはめになりそうなんですが (^^;

coolguys
質問者

お礼

COBOLは二種情報処理技術者試験のときに 簡単だからと言う理由で やらされました。 wark area、変数などを前もって定義しておくので Cで言うとグローバルの考えしか出来ていないってことです。 だから、いっつもグローバルで定義しちゃうので、 スコープなんて・・・です。 でも、分かりやすかったです。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • terra5
  • ベストアンサー率34% (574/1662)
回答No.7

大きさについては既に出ている通りですが、 他に寿命(?)も違います。 グローバル変数やスタティック変数の場合は、プログラムが実行開始されてから終わるまで, オート変数の場合,関数の処理が始まってから終わるまでが寿命となりますが、 malloc,calloc等のでとられるメモリは、プログラマが寿命を決めます。 mallocを呼んだ時に生まれ,freeを呼ばれた時に消えます。 (freeされなければ、プログラムが終わるまで) ところで、unixの共有メモリの話がでてましたけど、 通常はsystem V系のshmget,shmatがシステムコールとして組み込まれていてそれを使いますし、 malloc系の関数はプロセス内部のメモリしか扱わないので,共有メモリの操作には使われないと思いますが。

coolguys
質問者

補足

変数の寿命を考えることが出来るのですね。 ということは普通にintなどと定義したときよりは 資源が有効に使えるんですね。 よく変数の寿命とか分からないので、 みんなグローバルにしていたら、COBOLかよと よく言われている私には苦手なトコです。

全文を見る
すると、全ての回答が全文表示されます。
回答No.6

#5の者です。 >Windows のメモリは使われてないとこだらけになって 別に Windows というわけではないですね。失礼しました。(^^;

全文を見る
すると、全ての回答が全文表示されます。
回答No.5

allocとは要素の数が決まってない場合に使うものです。 たとえば 1)個数が全く予測の出来ない場合 2)通常は10個分ぐらいあればいいけど、ある条件の時には100万個必要になる。 1)の場合は int nantoka[100]; ってやったんじゃまずいのは分かりますよね? 1000 だって 10000 だってまずいですよ。 2)の場合 常に100万個分のエリアを確保するとものすごく無駄ですよね。 int nantoka[1000000]; allocを使用すればその都度必要な分だけを確保することができて、いらなくなったら削除できるので無駄がなくなるわけです。十分に大きいエリアを最初から取っとけばいいじゃんというコーディングをみんながしたら Windows のメモリは使われてないとこだらけになってすぐにメモリが足りなくなりますよ。(^^;

coolguys
質問者

補足

回答ありがとうございます。 無駄が無くなる。 こいつは"出来るな"って思われるようになるわけですね。 他のアプリのことも考えてのプログラムって事ですね。 例えばの場合のと申しますか、 参考のソースを少し教えていただけませんか? どのように定義するのだとかということなども。 お願い致します。

全文を見る
すると、全ての回答が全文表示されます。
  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.4

> allocとか使わなくても > 最初から大きいサイズを用意しておくということでも良いのですよね。 これは、ある意味正解です。 ただし、その大きいサイズを用意するのが無駄すぎる、とか、実メモリが少ない 環境でもそこそこ動いて欲しい(*)場合なんかには、できないアプローチです よね。   (*) 一杯メモリが積んであるならば、画像を同時に100枚でも処理できるが、     同時に2枚までの処理で良いから、少ないメモリのマシンでも動いてほしい、とか > でも、いまいちよく理解できませんでした。 ん~、力不足(私が、ね)。 プログラムの動作時に大きさを変えられるかどうか、って違いがあることはOK なんですよね。 であれば、今は、その程度の理解でも良いかも。 「スタック」とか「ヒープ」とかっていう言葉に遭遇してから、理解を深めても 十分。

coolguys
質問者

補足

ありがとうございます。 一歩進みました。 実際にサイズが変化するようなものに であったことが無かっただけにイメージが湧きませんでした。 プラスして、実装メモリなんてモノも全く気にしていませんでした。 allocとかが使えるようになると、PC資源の 有効利用ができるって言うことですよね。

全文を見る
すると、全ての回答が全文表示されます。
回答No.3

失礼しました。 APとはアプリケーションの略で使いました。 UNIXでは共有メモリという考えでよく使用されるのですが、 例えばA、Bという二つのアプリケーション(以下AP)があるとします。 Aでメモリ領域を確保しその領域に"あいう"と書き込むとします。 Bでそのメモリ領域を参照し"あいう"を取得する場合には、 メモリ領域の確保にalloc系の関数が使用されます。(malloc、globaalloc等々) 伝わりましたでしょうか…。

全文を見る
すると、全ての回答が全文表示されます。
回答No.2

char等の変数宣言もalloc系関数も、 メモリを確保するという点では変わらないのですが、 変数宣言した場合は宣言したAPからしかそのメモリ領域を利用できないのに対して、 alloc系関数では他のAPからでもその領域にアクセスできるという違いがあります。

coolguys
質問者

補足

APってなんでしょうか? アプリ?アクセスポイント? 教えていただけませんか?

全文を見る
すると、全ての回答が全文表示されます。
  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.1

> メモリ領域を確保するとかって言うことらしいのですが、 > charとかintとかで定義するのとは違うのですか? 違います。 「欲しいサイズのメモリを使えるようにする」という意味では、ほとんど差が無い のですが、その用意の仕方が違います。 変数で宣言する場合には、あらかじめソースを書く段階で、型とその大きさ(配列の 個数)が決っていなければなりません。 それだけで、不自由が無ければそれで良いのですが、実際には、プログラムを動かして いるときに、初めてその大きさが決まり、そのサイズのメモリが欲しい、というときが あります。 その場合には alloc 系の関数を使うしかないです。 と言いつつも、新しい C の規格(C99)では、alloc 系の関数を使わなくても、大きさを 後から決められる配列が使えたりします。 ★こんなソースがかけちゃう! int size; scanf("%d", &size); int data[size]; /* おおっと! */ /* 今までの C では、こう書くしかなかったんです。 int size; int *data; scanf("%d", &size); data = malloc(size * sizeof(int)); */ 後、細かいことを言うと、変数の宣言で用意されるメモリの場所と、alloc 系の関数で 用意される場所が微妙に(それぞれの中でもやり方によって)違います。まあ、この あたりは、もっと突っ込んだことをやるようになってから覚えてもいいでしょう。

coolguys
質問者

補足

回答ありがとうございます。 でも、いまいちよく理解できませんでした。 大変申し訳ありませんが、 さらに、詳しく(無理だとは思いますが、)お願いできませんでしょうか? なんとなくでは、分かってきたんですが 分かった・分からないかと聞かれた場合に分からないとなってしまいますもので。 何処が分からないかと言うと、イメージが湧きにくいというのも 有ると思うのですが、allocとか使わなくても 最初から大きいサイズを用意しておくということでも良いのですよね。 よろしくお願いいたします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • int型の文字列について

    文字列を扱う場合はchar型をつかいますが、int型がchar型より大きいメモリ領域を確保しているとすると、int型で文字列を扱っても問題はないのではと思いました。 実際にやってみると、処理系によって問題なく作動するものとそうでないものが有りますが、基本的な考え方として文字列をint型で扱うことは問題があるのでしょうか? ご存知の方よろしくお願いいたします。 <補足> 要は、255以下の数字を扱うときに、char型でないといけないという制約はなく当然int型を使えるように、文字列においてint型を使うことは、基本的な考え方として問題なのかをお聞きしたい。 当然、処理系において、ルール的に禁じている場合は使えないということは理解できますが。

  • C言語におけるローカル変数が使用するメモリについて

    例のようなC言語のプログラムを動かした場合、 確保されるメモリ領域はどうなるのでしょうか。 例 #include <stdio.h> int main(void) { int a = 0; } このとき、変数aはint型なのでスタック領域に4バイトのメモリが確保されると理解しています。 と同時にaという変数名と確保されたスタック領域の番地を紐づけるようなメモリがどこかに確保されるのではないかと思ってるのですが、この理解で正しいでしょうか。 またその場合は変数aの番地はどの領域に確保されるのでしょうか。 ご教示お願いいたします。

  • 動的メモリ確保の外部関数

    画像処理関係のプログラムを作成しているのですが(C言語で)、動的にメモリ確保をすることが頻繁にあります。 そこで、どんな型(int,char,double,etc..)の場合でもメモリ確保できるような、1つの外部関数を作成したいと考えています。 例えば、 int Memory(引数) { 型宣言; int型の動的メモリ確保; char型の動的メモリ確保; double型の動的メモリ確保; return 0; } イメージでは、上のような感じです。 もしかして、このような考えは、不可能でしょうか? どなたか良いアドバイスがあれば、ご教授ください。 よろしくお願いします。

  • intやshortやcharの変数確保時間

    for文などでよく一時変数に for ( int i=0; ・・・ とか for ( short s=0; ・・・ とか for ( char i=0; ・・・ みたいに整数型の変数が使われます。 確か変数の表せる範囲は long>int>short>char だったと思うのですが、変数を確保する時間やメモリサイズに違いはあるのでしょうか? たとえばlong型変数を10万個確保する時間とintとかshortとかcharのそれ とは違いがあるのかなぁと疑問に思いました。

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

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

  • 構造体で・・・・

    構造体は配列を使用せずメモリ領域を獲得する関数を使用すること、 *構造体内部のメンバ名には配列を用いて良い。  という、条件があるのですが場合はどのようにすればよろしいでしょうか? どなたか教えてください。 構造体は以下のようになってます。 /*構造体の定義*/ struct seiseki{   char name[20];   int eig;   int suu;   int kok;   char rank[3]; };

  • char (*data)[10] のようなポインタの使い方教えてください

    char (*data)[10]; のようのポインタの使い方がよくわからないので, 詳しい方いたら,教えてください. void main (){ char (*data)[10]; data = ????;//newを使ってメモリを確保したい for (int i = 0; i < ????; i++){ for (int j = 0; j < 10; j++){ data[i][j] = 何かデータ; } } //最終的にはこんな風に使いたいと思っています. } このような感じで new を使ってメモリの領域を確保したいのですが, どうもうまくいきません. data = new char[3]; data = new char*[3]; など,いろいろ試したのですが,だめでした. 使用しているOSはwindowsXPでvisual studio 2005を使ってプログラムをコンパイルしています. わかる方いたら,よろしくお願いします.

  • mySQLのカラムの並び順によるデータ領域確保について

    mySQLのカラムの並び順によるデータ領域確保について http://d.hatena.ne.jp/yarb/20090519/p2 のような4バイト単位で領域を確保するのでしょうか? 同じテーブルでも並び順は、4バイト単位を意識して、 パターン1で作成した方が効率は良いのでしょうか? ■パターン1 tinyint(1) tinyint(1) tinyint(1) char(1) int int int ■パターン2 tinyint(1) int tinyint(1) int char(1) int tinyint(1)

    • ベストアンサー
    • MySQL
  • 多次元配列のメモリ解放

    多次元配列のメモリ解放についてです。 以下のような方法で多次元配列を確保した場合に、 --- char** ppMain; ppMain = new char*[3]; for (int i = 0; i < 3; i++){ ppMain[i] = new char[20]; } --- メモリ解放する場合、 --- for (int i = 0; i < 3; i++){ delete [] ppMain[i]; ppMain[i] = NULL; } delete [] ppMain; ppMain = NULL; --- で良いでしょうか? おそらく、new/deleteの回数が同じであれば問題ないと思うのですが。 少し混乱してしまって、 delete [] ppMain[i]; によって new char*[3]で確保したところも解放されており delete [] ppMain; が必要なく危険な領域まで解放しようとしているということはないでしょうか? ご専門、お詳しいかたコメント宜しくお願いします。

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

    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; }

このQ&Aのポイント
  • 本日、購入したばかりのノートPCの画面が薄く、見づらい状況です。設定の仕方を教えていただきたい。
  • ノートPCの画面が非常に薄く、使いづらい状態です。画面の設定方法について教えてください。
  • 購入したばかりのノートPCの画面がとても薄く、文字が読みづらいです。画面の設定についてアドバイスをお願いします。
回答を見る

専門家に質問してみよう