メモリの動的管理

配列は、要素数が固定されているため、要素数を変更することができません。しかし、配列の長さ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関数では、指定したサイズのメモリを確保し、確保したメモリのアドレスを返します。ポインタ変数を配列のようにインデックスを指定すれば、確保したメモリにアクセスできます。

メモリの確保