Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C言語で2次元配列を動的に確保する方法

C言語では、単一のポインタを使うことで2次元配列を動的に確保できます。具体的には、malloc関数で「行数 × 列数 × データ型サイズ」分の連続したメモリブロックを確保し、ポインタ演算によって各行列要素にアクセスします。

以下に、この方法を示すサンプルプログラムを紹介します。

サンプルコード

#include <stdio.h>
#include <stdlib.h> 
int main() {
   int row = 2, col = 3;
   int *arr = (int *)malloc(row * col * sizeof(int)); 
   int i, j;
   for (i = 0; i < row; i++)
      for (j = 0; j < col; j++)
         *(arr + i*col + j) = i + j;    
   printf("The matrix elements are:\n");
   for (i = 0; i < row; i++) {
      for (j = 0; j < col; j++) {
         printf("%d ", *(arr + i*col + j)); 
      }
      printf("\n");
   }
   free(arr); 
   return 0;
}

上記プログラムの実行結果は以下の通りです。

The matrix elements are:
0 1 2 
1 2 3

プログラムの解説

1. メモリの動的確保と初期化

まず、mallocを使って2次元配列arr用のメモリを動的に確保します。続いて、ネストしたforループとポインタ演算を組み合わせて、配列の各要素を初期化しています。該当するコード部分は以下の通りです。

int row = 2, col = 3; 
int *arr = (int *)malloc(row * col * sizeof(int));
int i, j;
for (i = 0; i < row; i++)
   for (j = 0; j < col; j++)
      *(arr + i*col + j) = i + j; 

ここでのポイントは、要素へのアクセス式 *(arr + i*col + j) です。これは arr[i * col + j] と同じ意味であり、1次元の連続メモリを行・列の2次元構造として扱うための計算です。「列数 × 行番号」分だけオフセットを進めることでi行目の先頭に到達し、そこからさらにj個進んだ位置の要素へアクセスします。

2. 要素の表示とメモリの解放

次に、初期化した2次元配列の値を画面に表示します。最後に、free関数を呼び出して、動的に確保したメモリを解放します。メモリリークを防ぐため、mallocで確保したメモリは必ず解放するようにしましょう。該当するコード部分は以下の通りです。

printf("The matrix elements are:\n");
for (i = 0; i < row; i++) {
   for (j = 0; j < col; j++) {
      printf("%d ", *(arr + i*col + j)); 
   }
   printf("\n");
}
free(arr); 

補足:その他の動的確保の方法

なお、C言語で2次元配列を動的に扱う方法は他にもあります。例えば、ダブルポインタ(ポインタの配列)を使って行ごとに個別にメモリを確保する方法や、C99以降で利用できる可変長配列(VLA)へのポインタを使う方法などが挙げられます。今回紹介した単一ポインタ方式は、メモリが連続しているためキャッシュ効率が良く、確保も解放も一度で済むという大きな利点があります。

  1. JavaScriptにおけるメモリ割り当ての仕組みとガベージコレクション

    プログラミング言語を問わず、メモリのライフサイクルはほぼ共通しており、次の3つの段階で構成されます。必要なメモリを割り当てる(アロケーション)割り当てられたメモリを使用する(読み書き)不要になったメモリを解放する言語による違い:明示的か暗黙的かこのうち2番目の「メモリの使用」は、すべての言語において開発者が明示的に行う必要があります。一方、1番目の「割り当て」と3番目の「解放」については、C言語のような低レベル言語では明示的に記述する必要がありますが、JavaScriptのような高レベル言語では主に暗黙的に処理されます。JavaScriptでは明示的なメモリ管理ができないそのため、JavaSc

  2. 【JavaScript入門】配列を使ってラジオボタンを動的に生成する方法

    JavaScriptでは、配列のデータをもとにラジオボタンを動的に生成することができます。その際に活用するのが、要素を作成する createElement() メソッドと、作成した要素を画面に追加する appendChild() メソッドです。 サンプルコード 以下は、性別の選択肢を配列で管理し、それを元にラジオボタンを自動生成するコード例です。 <!DOCTYPE html> <html lang=ja> <head> <meta charset=UTF-8> <meta name=viewport content=width=devic