読者です 読者をやめる 読者になる 読者になる

C言語 多次元配列

他言語同様、C言語でも多次元配列を使うことが出来る。定義は、

型名 配列名 [n次元目要素数][n-1次元目要素数]…[1次元目要素数]

と書く。

一様分布従う乱数を発生させ、それを100×100×100の3次元配列に格納してみる。乱数発生はココを参照。

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

int main(void) {
        int record[100][100][100];
        int i = 0;
        int j = 0;
        int k = 0;
        for(i = 0; i < 100; i++) {
                for(j = 0; j < 100; j++) {
                        for(k = 0; k < 100; k++) {
                                srand(i+j+k);                   //一様乱数を発生させるrand()関数のseed
                                record[i][j][k] = rand()%6+1;  //1から6までの乱数を発生し、配列に格納
                                printf("%d\n",record[i][j][k]);
                                                }
                                        }
                                }
}

これで、100×100×100の配列に1~6の範囲で発生させた一様分布に従った乱数が格納されたことになる。

なお、配列のサイズは要素数×変数型に応じたバイト数であり、上記の場合であれば、100×100×100×4(int型は1文字4バイト)=4,000,000バイトのメモリが必要となる。

ローカル変数で大きいサイズの配列を定義した場合、ローカル変数を格納する「スタック」と呼ばれる場所にメモリを確保出来ない場合があるとのこと。しかも、多くのコンパイラはスタックのメモリが確保出来ない事について警告を出さないらしい。これを防ぐ手段としては、主に3つ。

1:static変数やグローバル変数を使う。(スタックを使わない)

2:malloc()関数を使う

3:アウトプットを随時出力する

1については以前勉強した。2については後日考えることにする。3はRでも考えていることで、当たり前かと思う。