私のCプログラムで、この配列値を割り当てようとすると、次のようになります。
double sample[200000][2];
セグメンテーション違反エラーが発生します。しかし、私が使用するとき:
double sample[20000][2]
できます!!これらの指標値に制限はありますか?
200,000 x 2 = 400,000
double 値用にスペースを予約しようとしたようで、それぞれdouble
が 8 バイトであるため、約3.2 メガバイトを予約しようとしました。
マシンに数ギガのメモリが搭載されている可能性がありますが、スタック領域はプロセスごとおよびスレッドごとに制限されており、1 メガバイトまたは 2 メガバイトに制限されている可能性があります。したがって、3 MB を割り当てることができず、クラッシュします。
これを修正するには、を使用して動的メモリに変更しますmalloc
。
これにより、スタックスペースよりもはるかに豊富なヒープスペースから割り当てることができます。
malloc を使用するには:
double (*sample) [200000];
s = malloc(sizeof(*sample) * 2);
sample[0][0] = 0.0;
sample[1][199999] = 9.9;
スタックがオーバーフローしている可能性があります。これは、最新の実装では自動変数であり、サイズが制限されているスタックに割り当てられるためです。
たとえば、ビジュアル スタジオのスタック サイズはデフォルト1MB
ですが、変更可能です。典型的なスタックサイズのより完全なリストがここにあります:
SunOS/Solaris 8172K bytes
Linux 8172K bytes
Windows 1024K bytes
cygwin 2048K bytes
大量のデータがある場合にスタックに割り当てる代わりに、mallocを介して動的割り当てを使用することができます。CのFAQには、多次元配列を動的に割り当てるにはどうすればよいですか?に関する参考文献があります。、 doubleの 2 次元の例を変更します。
#include <stdlib.h>
double **array1 = malloc(nrows * sizeof(double *));
for(i = 0; i < nrows; i++)
array1[i] = malloc(ncolumns * sizeof(double));