メモリの動的管理
配列は、要素数が固定されているため、要素数を変更することができません。しかし、配列の長さ10個だけ必要なとき、100個だけ必要なとき、1000個だけ必要なとき...があると思います。予め1000個の長さの配列を作っても、10個だけしか使わなければ9990個は無駄になります。このような場面には、malloc
関数を用いて動的にメモリを確保します。メモリを確保する際、変数のサイズを考慮する必要があります。変数のサイズの取得は sizeof
演算子を用いて行います。
malloc
関数は引数で指定した分、メモリを確保し、確保したメモリのアドレスを返します。malloc
関数はヘッダファイル stdlib.h
に定義されています。 malloc
関数で確保したメモリは、使用後に free
関数で解放する必要があります。
次に malloc
関数の使用例を示します。 入力された長さの int 配列を作成し、0から順に代入し、出力するプログラムです。動的配列は、ポインタ変数を用いて宣言します。 malloc
関数で確保したメモリを使用後、 free
関数で解放しています。動的配列は malloc
関数でメモリを確保するまで、アクセスできません。また、free
関数でメモリを解放したら、アクセスすることができなくなります。#include <stdlib.h>
を忘れないでください。
#include <stdio.h>
#include <stdlib.h>
int main() {
int length;
int *arr;
scanf("%d", &length);
// int のサイズを length 個分メモリ確保
arr = (int *)malloc(sizeof(int) * length);
for (int i = 0; i < length; i++) {
arr[i] = i;
}
for (int i = 0; i < length; i++) {
printf("%d\n", arr[i]);
}
free(arr);
}
3
と入力した場合、次のように出力されます。
0
1
2
10
と入力した場合、次のように出力されます。
0
1
2
3
4
5
6
7
8
9
メモリを確保したときのメモリのイメージ図を以下に示します。malloc関数では、指定したサイズのメモリを確保し、確保したメモリのアドレスを返します。ポインタ変数を配列のようにインデックスを指定すれば、確保したメモリにアクセスできます。