5

私のCプログラムで、この配列値を割り当てようとすると、次のようになります。

double sample[200000][2];

セグメンテーション違反エラーが発生します。しかし、私が使用するとき:

double sample[20000][2]

できます!!これらの指標値に制限はありますか?

4

2 に答える 2

9

200,000 x 2 = 400,000double 値用にスペースを予約しようとしたようで、それぞれ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;
于 2013-11-04T22:51:05.107 に答える
6

スタックがオーバーフローしている可能性があります。これは、最新の実装では自動変数であり、サイズが制限されているスタックに割り当てられるためです。

たとえば、ビジュアル スタジオのスタック サイズはデフォルト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));
于 2013-11-04T22:46:22.787 に答える