在我的C程序中,当我尝试分配此数组值时:
double sample[200000][2];
Run Code Online (Sandbox Code Playgroud)
我收到了分段错误错误.但是当我使用时:
double sample[20000][2]
Run Code Online (Sandbox Code Playgroud)
有用!!这些指数值是否有限制?
看起来你试图为200,000 x 2 = 400,000双值保留空间,每个double都是8个字节,所以你试图保留大约3.2兆字节.
即使您的计算机可能有几个Gig内存,但每个进程和每个线程的堆栈空间有限,并且可能限制为1或2兆字节.所以你不能分配3兆,你就崩溃了.
要解决此问题,您需要使用更改为动态内存malloc.
这将让你从堆空间分配,这比堆栈空间更丰富.
要使用malloc:
double (*sample) [200000];
s = malloc(sizeof(*sample) * 2);
sample[0][0] = 0.0;
sample[1][199999] = 9.9;
Run Code Online (Sandbox Code Playgroud)
您可能会溢出堆栈,因为在大多数现代实现中它都是自动变量,它们将分配在大小有限的堆栈上.
例如,visual studio中的堆栈大小默认1MB为可修改.有典型的堆栈大小的更完整的列表在这里:
SunOS/Solaris 8172K bytes
Linux 8172K bytes
Windows 1024K bytes
cygwin 2048K bytes
Run Code Online (Sandbox Code Playgroud)
到分配,如果你有大量的数据的堆栈另一种方法是使用动态分配通过的malloc.该Ç常见问题有一个很好的参考我如何动态分配一个多维数组?,将他们的二维示例修改为double:
#include <stdlib.h>
double **array1 = malloc(nrows * sizeof(double *));
for(i = 0; i < nrows; i++)
array1[i] = malloc(ncolumns * sizeof(double));
Run Code Online (Sandbox Code Playgroud)