c言語でメモリ足らなくなった時に、使えるメモリを増やす方法(malloc関数)
c言語で大きな配列を用意しなければならない時に、メモリが足らなくて「Segmentation Fault」と怒られることがよくあります。
これは、そのPCが使えるメモリ量を、宣言した関数で必要なメモリ量が上回ってしまうために起きます(プログラムは間違っていないにも関わらず)。
c言語の良いところは、高速計算が得意な部分です。Pythonとかは便利だけど、やっぱ遅い。多くのサンプルに対して、長時間計算させるプログラムを実行させるには、Pythonよりもc言語が適していると思います。
なのに、大規模配列でメモリ制限を食らうと、c言語の良さが活かしきれません。
それを防ぐために、計算で使っているメモリ以外の記憶領域からメモリを一時的に借りてきて、大規模配列の宣言を可能にする方法をメモしておきます。
結論は
malloc関数を用いることです。
通常、float型で配列を用意する時、
float abc[100]={};
というように用意しますが、
malloc関数を用いる場合、最初の宣言はポインタの状態にします。
float *array;
その後、malloc関数を使って、
array=(float*)malloc(10000000*sizeof(float));
と書くと、大きな配列を用意することができます。
これは、sizeがfloatの配列を1000000個用意してくださいという指示になります。
一時的に借りているだけなので、最後にこのメモリを解放する必要があるため、free関数を使って、
free(array);
とすると、メモリを解放して元の状態に戻すことができます。
ちなみに2次元の配列を用意したいときは、
for文でmallocを回してあげれば良いです。
float *def[10000];
for(j=0;j<10000;j++){
def[j]=(float*)malloc(10000*sizeof(float));
}
とすると、10000×10000の配列が出来上がります。
メモリ解放はfreeを回してあげればいいので、
for(j=0;j<10000;j++){
free(def[j]);
}
とすると、元に戻ります。
これで、大規模な配列を用意し、大きな計算もメモリを気にすることなく実行できます。
(とは言っても限りはありますでしょうから、メモリ節約はできるだけ行いましょう)。