C言語の2次元配列を0で初期化する方法について解説します。
2次元配列とは、行と列からなる表形式のデータ構造です。プログラミングにおいて頻繁に使用されますが、初期化を忘れた場合や不適切な初期化をした場合、予期しない結果が生じることがあります。
正しい方法で2次元配列を0で初期化することは、プログラムの安定性向上につながります。
2次元配列の初期化方法
プログラミングにおいて、2次元配列を使用することはよくあります。
しかし、2次元配列を宣言しただけでは、その中身がどのような値で初期化されるかは保証されません。まずは、2次元配列の初期化方法について見ていきましょう。
初期化しない場合の値
C言語では、変数や配列を宣言しただけでは自動的に0で初期化されません。そのため、以下のコード例のように2次元配列を宣言しても中身は不定値となります。
int array[3][3];
上記コード例でarray[0][0]
からarray[2][2]
まで全て不定値です。
memset関数を使った初期化方法
memset関数は指定したメモリ領域に指定したバイト数分同じ値をセットする関数です。これを利用して以下のようなコードで全要素が0で初期化された二次元配列が作成出来ます。
#include <string.h>
int array[3][3];
memset(array, 0, sizeof(array));
上記コード例では sizeof()
演算子 を使って array
のサイズ(=要素数×1要素あたりのバイトサイズ)を取得しました。 これにより、配列のデータをを0で埋め尽くすことが出来ました。
for文を使った初期化方法
for文でも簡単に二次元配列全体を特定の値(今回はゼロ)で埋めることが出来ます。 以下はfor文内部処理内容です。
int array[3][3];
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < 3; ++j) {
array[i][j] = 0;
}
}
上記コード例でも同様に全要素がゼロ(=0以外でも可) で埋められます。
もちろん、0ではなく何らかの計算結果など任意の数値で初期化することも可能です。
calloc関数を使った初期化方法
calloc() 関数はメモリ確保時点からで0クリアできるmalloc関数の強化版です。
#include <stdlib.h>
// int型3x32重配列表現用ダブルポインター生成
// ※エラー判断省略版
void create_array(int ***p){
*p=(int **)calloc(sizeof(int*),4);
(*p)[1]=(int *)calloc(sizeof(int),12);
}
// main()
{
int **a;
create_array(&a); // a: int** 型変量
// 結果表示
printf("%d %d %d\n", a[1][1], a[1][2], a[1][3]);
}
配列要素が大きい場合の注意点
配列要素が大きい場合、メモリ使用量が増えるため注意が必要です。特に2次元配列の場合は、行数と列数を掛けた値だけのメモリを確保する必要があります。
例えば、int型の2次元配列で10,000行×10,000列を作成する場合、約400MBものメモリを消費します。
このような大規模な配列を扱う際には、十分なメモリ容量があるかどうかやプログラム実行時のパフォーマンスに影響しないか等を考慮する必要があります。
また、初期化方法によっては処理時間も変わってくるため、適切な初期化方法を選択することも重要です。