はじめに
私は初心者である。この備忘録を参考にされようとしている他の初心者の方は、ここに書かれていることを鵜呑みになさらぬようお願いしたい。何か間違いを見つけた方はコメント欄でご報告頂きたい。
動的確保の基本
記憶領域というものは普通、プログラム内で宣言した変数のための領域として確保される。
その種類は、自動変数、レジスタ変数、外部変数、静的変数であると。
変数のための記憶領域の大きさは、動作させるプラットフォームが決まっていたら、基本的にはプログラムを書いた時点で決まるらしい。今後出てくる可変長配列とやらは除くとのことだが。
しかしプログラムの実行中に、特別な大きさの領域が必要になることがある。Webブラウザが画像をサーバーからダウンロードしてメモリに入れる時など。そんな時に使えるのが動的記憶域確保(動的確保)らしい。
Cでは言語の機能として動的確保が提供されているわけではなく、ここから記録するのはAPIである。
動的確保の使い方
動的確保する関数は複数あるらしい。
まずはmalloc
関数。指定されたバイト数のメモリ領域を確保して、その先頭へのポインタを返す。確保された場合の領域にはゴミの値が入っていて、確保できなかったらナルポインタを返す。
関数free
は、mallocなどで動的に確保された領域へのポインタを渡すと、その領域を解放するらしい。
これらを使うにはstdlib.h
を取り込む。
int型の領域が欲しい場合には下記のようにする
int *p;
p = malloc(sizeof(int));
free(p);
要素を1000個もつdoubleの配列が欲しい場合は以下のように。
double *p;
p = malloc(sizeof(double)*1000); // p[0]からp[999]]まで使える
free(p);
コード例として20要素をもつintの配列が入る領域をmallocで確保し、フィボナッチ数列を表示させようってのがあったので一応貼っとく(がこれじゃないだろう感を感じる)
#include <stdio.h>
#include <stdlib.h>
enum {
N = 20,
};
int main(void){
int *p;
int i;
if ((p = malloc(sizeof(int) * N)) == NULL){ // エラー処理
printf("cannot allocate memory\n");
return 1;
}
p[0] = p[1] = 1;
for (i=2; i<N; i++)
p[i] = p[i-1] + p[i-2];
for (i=0; i<N; i++)
printf("%d ", p[i]);
printf("\n");
free(p);
return 0;
}
if ((p = malloc(sizeof(int) * N)) == NULL){~}
のあたりはmallocを使う際のエラー処理の常套句らしい。
動的に確保された領域の生存期間
mallocなどで確保されてからfreeで解放されるまで!
(プログラムの終了時には、その時点でそのプログラムが使っているすべての領域が解放される。動的確保された領域も同じ。)
伸びる配列を作る
realloc関数
realloc
関数は、mallocなどで確保済みの領域の大きさを、メモリ内容を保持したまま変えるAPIだと。
少々今時間がないので名前だけで割愛!知るべき時が来たらやる(新しいC言語の教科書 P486)
今回の内容は富永和人氏の新しいC言語の教科書を参考に書き留めてます。