c言語で巨大配列

c言語で巨大配列を作成しようとして、エラーを体験した人は多いのではないでしょうか。環境によっては問題なく作れたりするかもしれませんが、MicrosoftのVisual Studioでc言語を動かそうとすると、巨大配列でエラーが発生し止まります。

例えばこんな感じで、巨大配列でエラーを出すプログラム

#include<stdio.h>
int main(void){
 double A[1000][1000]={0};
 return 0;
}

上のプログラムを動かすと「ハンドルされない例外が○○で発生しました: 」「Stack overflow」とエラーが発生しプログラムが止まります。main関数内で使えるメモリに制限があるため止まってしまうようです。要は「メモリ食い過ぎだから止めるね」ってことですね。

簡単に解決するにはmain関数の前に出しちゃってグローバル変数にしちゃう方法があります。

グローバル変数で巨大配列を使うプログラム

#include<stdio.h>
double A[1000][1000]={0};
int main(void){
 return 0;
}

もうちょっとまともな解決方法はmalloc関数を使用し、使う分だけちゃんとメモリを確保してあげることです。

メモリを確保し、巨大配列を使うプログラム

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

int main(void){

 int i=0;
 int x=1000,y=1000;
 double **A;

 A=(double**)malloc(sizeof(double)*x);
 for(i=0;i<x;i++){
  A[i]=(double*)malloc(sizeof(double)*y);
 }
///////////////////////////////////////////
/*この間で配列を使う*/
///////////////////////////////////////////

 //配列使用後メモリ領域解放
 for(i=0;i<x;i++){
  free(A[i]);
 }
 free(A);

 return EXIT_SUCCESS;
}

上の様に配列を宣言すれば一応エラーが起きずに巨大配列を使えます。malloc関数を使うにはstdlib.hが必要なのでインクルードしてます。自分が実際にポインタを必要とした例はこれが初めてです。ポインタって参考書には必ず出てくるくせに、あんまり応用例が載って無くていまいち使いどころがわからないですがここに応用できます。またポインタを使用して配列を宣言することで、配列の個数「A[この部分][この部分]」に変数を使うことができます。動的確保とか言うらしいです。変数を使わずに定数で宣言するのは静的確保らしいです。
ちなみにmalloc関数を使ってるのでちゃんとfree()を使ってメモリ解放しておかないと大変なことになりますので注意。

記事を書いた日 2014年 5月

トップページへ inserted by FC2 system