【C言語】2次元配列をmallocで初期化する方法

この記事では、C言語で動的な2次元配列を作成する方法と、その要素へのアクセス方法について解説します。

さらに、静的な2次元配列との違いや、malloc関数を使った初期化方法も紹介します。

C言語の初心者の方にとって、2次元配列の扱い方を理解するのに役立つ内容です。

目次から探す

malloc関数を使った動的な2次元配列のメモリ確保

動的な2次元配列を作成するためには、malloc関数を使用してメモリを確保する必要があります。

malloc関数は、指定したバイト数のメモリを動的に確保し、その先頭アドレスを返します。

以下のコードは、malloc関数を使用して3行4列の2次元配列を作成する例です。

#include <stdio.h>
#include <stdlib.h>
int main() {
    int rows = 3;
    int cols = 4;
    // メモリの確保
    int** array = (int**)malloc(rows * sizeof(int*));
    for (int i = 0; i < rows; i++) {
        array[i] = (int*)malloc(cols * sizeof(int));
    }
    // メモリの解放
    for (int i = 0; i < rows; i++) {
        free(array[i]);
    }
    free(array);
    return 0;
}

このコードでは、int**型のポインタarrayを宣言し、malloc関数を使用してrows行分のメモリを確保しています。

そして、各行ごとにcols列分のメモリを確保しています。

動的な2次元配列の要素へのアクセス

動的な2次元配列の要素にアクセスするには、通常の2次元配列と同様に、行と列のインデックスを指定します。

以下のコードは、先ほど作成した3行4列の2次元配列に値を代入し、要素を表示する例です。

#include <stdio.h>
#include <stdlib.h>
int main() {
    int rows = 3;
    int cols = 4;
    // メモリの確保
    int** array = (int**)malloc(rows * sizeof(int*));
    for (int i = 0; i < rows; i++) {
        array[i] = (int*)malloc(cols * sizeof(int));
    }
    // 値の代入
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            array[i][j] = i + j;
        }
    }
    // 要素の表示
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%d ", array[i][j]);
        }
        printf("\n");
    }
    // メモリの解放
    for (int i = 0; i < rows; i++) {
        free(array[i]);
    }
    free(array);
    return 0;
}

このコードでは、2重のforループを使用して、各要素に値を代入しています。

そして、再度2重のforループを使用して、各要素を表示しています。

静的な2次元配列と動的な2次元配列の違い

静的な2次元配列と動的な2次元配列の主な違いは、メモリの確保方法です。

静的な2次元配列は、コンパイル時にメモリが確保され、プログラムの実行中はそのメモリが常に存在します。

一方、動的な2次元配列は、実行時に必要量だけメモリを確保し、必要な時に解放することができます。

malloc関数を使った動的な2次元配列の初期化方法のまとめ

malloc関数を使用して動的な2次元配列を初期化する手順は以下の通りです。

  1. 行数と列数を指定して、行のメモリを確保する。
  2. 各行ごとに列のメモリを確保する。
  3. 必要に応じて、各要素に値を代入する。
  4. メモリを解放する。

動的な2次元配列を使用する際には、メモリの確保と解放に注意する必要があります。

メモリの解放を忘れるとメモリリークが発生し、プログラムのパフォーマンスに悪影響を与える可能性があります。

目次から探す