malloc 動的なメモリ割り当て

mallocのC言語のライブラリ関数だ。
なんでこんなのがいるかというと「実行するまでどのくらいのメモリを使うかわからない」という場合に使う。
メモリ領域ではヒープ領域というところに作られる。
この例では、free関数を使って解放していない。
しかし、main関数を抜けるとこのアプリケーション自体が無くなるので自動的にOSが解放してくれる。(OSは大抵解放できる能力をもってえいる。必ずではない)
以下のコードは何度もmallocして4バイトの連続したメモリ領域をヒープ領域に作る。
printfでmallocで確保した領域の先頭アドレスとp変数のアドレスを表示している。
C:\usr\lesson\opencv\C_C++の練習\malloc>type main.cpp
<stdio.h>
<stdlib.h>

int main(void){
       void *p;
       p=malloc(4);
       printf("p address:%x\n",p);
       printf("&p address:%x\n",&p);
       p=malloc(4);
       printf("p address:%x\n",p);
       printf("&p address:%x\n",&p);
       p=malloc(4);
       printf("p address:%x\n",p);
       printf("&p address:%x\n",&p);
       return 0;
}
C:\usr\lesson\opencv\C_C++の練習\malloc>main.exe
p address:384fc8
&p address:12ff74
p address:3830c0
&p address:12ff74
p address:3830d0
&p address:12ff74
p address:p変数が指しているアドレス。つまり、mallocで作った領域の先頭アドレス。p変数自体のアドレスは変わらない。
mallocする度に、別のヒープ領域に割り当てられていることに注意。

変数名pに惑わされない。

変数名は同じだが指している先がmallocする度に変る。
変わるということは、free(f)をreturn前に1回しても前の2つは解放できない。
<stdio.h>
<stdlib.h>

int main(void){
       void *p;
       p=malloc(4);
       printf("p address:%x\n",p);
       printf("&p address:%x\n",&p);
       p=malloc(4);
       printf("p address:%x\n",p);
       printf("&p address:%x\n",&p);
       p=malloc(4);
       printf("p address:%x\n",p);
       printf("&p address:%x\n",&p);
       free(p);
       return 0;
}

OpenCVの関数でもcreate、clone関係の関数がmallocに相当する。
名前:
コメント:
最終更新:2009年12月22日 10:00
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。