C言語

【C言語】第3章第11回:動的配列の作成と管理

動的配列は、実行時にメモリを割り当てたり、サイズを変更したりできる柔軟なデータ構造です。この章では、mallocreallocを使った動的配列の作成と管理方法を学びます。

1. 動的配列とは?

静的配列では、配列のサイズをコンパイル時に決定する必要がありますが、動的配列では実行時にサイズを変更できます。

以下の手順で動的配列を作成します:

  1. mallocを使用してメモリを動的に割り当てる。
  2. 必要に応じてreallocを使用してサイズを変更する。
  3. freeを使ってメモリを解放する。

2. mallocを使った動的配列の作成

例:動的配列の作成と要素の操作

#include <stdio.h>
#include <stdlib.h> // malloc, freeのためのヘッダー

int main() {
    int n;
    printf("Enter the number of elements: ");
    scanf("%d", &n);

    // 動的にメモリを割り当て
    int *arr = (int *)malloc(n * sizeof(int));

    if (arr == NULL) { // メモリ割り当てエラーのチェック
        printf("Memory allocation failed\n");
        return 1;
    }

    // 配列の初期化と表示
    for (int i = 0; i < n; i++) {
        arr[i] = i + 1; // 要素に値を代入
        printf("arr[%d] = %d\n", i, arr[i]);
    }

    free(arr); // メモリを解放

    return 0;
}

解説:

  • mallocは、指定したバイト数のメモリを動的に割り当てます。
  • 割り当てられたメモリは、ポインタarrで参照されます。
  • freeを使用して、不要になったメモリを解放します。

3. reallocを使ったサイズ変更

例:動的配列のサイズを変更

#include <stdio.h>
#include <stdlib.h>

int main() {
    int n = 5;
    int *arr = (int *)malloc(n * sizeof(int));

    if (arr == NULL) {
        printf("Memory allocation failed\n");
        return 1;
    }

    // 初期化
    for (int i = 0; i < n; i++) {
        arr[i] = i + 1;
    }

    // 配列のサイズを変更
    int new_size = 10;
    arr = (int *)realloc(arr, new_size * sizeof(int));

    if (arr == NULL) {
        printf("Memory reallocation failed\n");
        return 1;
    }

    // 新しい領域を初期化
    for (int i = n; i < new_size; i++) {
        arr[i] = i + 1;
    }

    // 結果を表示
    for (int i = 0; i < new_size; i++) {
        printf("arr[%d] = %d\n", i, arr[i]);
    }

    free(arr);

    return 0;
}

解説:

  • reallocは、既存のメモリブロックを新しいサイズに変更します。
  • 新しく割り当てられた領域にはデフォルト値が設定されないため、手動で初期化する必要があります。

4. 動的配列の管理における注意点

動的配列を使用する際には、以下の点に注意してください:

  • メモリ割り当てに失敗した場合にエラーを処理する。
  • 必要がなくなったメモリを必ずfreeする。
  • 解放したメモリへのアクセスを避ける。

例:解放後のアクセスを防ぐコード

#include <stdio.h>
#include <stdlib.h>

int main() {
    int *arr = (int *)malloc(5 * sizeof(int));

    if (arr == NULL) {
        printf("Memory allocation failed\n");
        return 1;
    }

    free(arr);
    arr = NULL; // 解放後にNULLを代入

    if (arr == NULL) {
        printf("Memory has been freed successfully.\n");
    }

    return 0;
}

5. 練習問題

以下の課題に挑戦して、動的配列の操作方法を習得してください。

  1. 動的配列を作成し、ユーザーが入力した整数を格納して表示するプログラムを作成してください。
  2. 動的配列を使用して、配列のサイズをユーザーが指定した新しいサイズに変更するプログラムを作成してください。
  3. メモリの解放が正しく行われているかを確認するプログラムを作成してください。

6. 練習問題の解答と解説

問1の解答

#include <stdio.h>
#include <stdlib.h>

int main() {
    int n;
    printf("Enter the number of elements: ");
    scanf("%d", &n);

    int *arr = (int *)malloc(n * sizeof(int));

    if (arr == NULL) {
        printf("Memory allocation failed\n");
        return 1;
    }

    for (int i = 0; i < n; i++) {
        printf("Enter value for arr[%d]: ", i);
        scanf("%d", &arr[i]);
    }

    printf("Array elements: ");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    free(arr);

    return 0;
}

7. まとめ

動的配列は、プログラムに柔軟性をもたらします。mallocreallocを適切に使用し、メモリ管理を徹底しましょう。