无法分配内存

在我的C代码中,我为2d数组double E[2000][2000];分配内存double E[2000][2000]; 但是当我运行它时会得到一个运行时错误Segmentation fault(core dumped) ,当我将数组大小减少到900左右时,代码运行正常。

为什么它显示运行时错误,因为双重占用64位内存(IEEE标准)所以代码应该占用大约32MB,这与ram大小相比并不多。如果在C中不支持,那么如果我的最大数量应该如何继续我必须存储的数据是4000000,每个都是浮点数。

您是否将E声明为局部变量? 如果是这样,你的堆栈内存就会耗尽。

 void func() { double E[2000][2000]; /// definitely an overflow } 

使用动态分配:

 double* E = malloc(2000 * 2000 * sizeof(double)); /// don't forget to "free(E);" later 

或者,如果您需要2Darrays,请使用之字形:

 double** E = malloc(2000 * sizeof(double*)); /* check that the memory is allocated */ if(!E) { /* do something like exit(some_error_code); to terminate your program*/ } for(i = 0 ; i < 2000 ; i) { E[i] = malloc(2000 * sizeof(double)); /* check that the memory for this row is allocated */ if(!E[i]) { /* do something like exit(some_error_code); to terminate your program*/ } } 

然后重新分配有点复杂:

 for(i = 0 ; i < 2000 ; i) { free(E[i]); } free(E); 

PS如果你想以连续的方式保存所有数据,那就有一个技巧(来自Takuy​​a Ooura的FFT包的代码)

 double **alloc_2d(int n1, int n2) { double **ii, *i; int j; /* pointers to rows */ ii = (double **) malloc(sizeof(double *) * n1); /* some error checking */ alloc_error_check(ii); /* one big memory block */ i = (double *) malloc(sizeof(double) * n1 * n2); /* some error checking */ alloc_error_check(i); ii[0] = i; for (j = 1; j < n1; j++) { ii[j] = ii[j - 1] + n2; } return ii; } void free_2d(double **ii) { free(ii[0]); free(ii); } 

你刚才打电话

 double** E = alloc2d(2000, 2000); 

 free_2d(E); 

我假设您只是简单地在堆栈上分配它

 double E[2000][2000]; 

这可能会超过分配给您的程序的堆栈大小。

尝试使用malloc(或c ++中的new)或使用选项增加程序的默认堆栈大小。 为此,可以使用setrlimit()配置gcc。

在gcc中设置堆栈大小

请记住,即使堆栈大小增加,此大小的数组也应该是全局的

如果一个维度的大小已固定,您还可以使用单个语句在堆上分配2D数组

 double (* E)[COLUMN_SIZE]; int rows = 20; // this is dynamic and can be input from user at run time E = malloc(rows * sizeof(*E)); // this needs to be freed latter 

更详细的类似示例分配没有循环的2d数组

这取决于您分配数组的位置。 使用堆栈空间可能会导致溢出(除非您让链接器分配一个额外的大堆栈)。

例如,这可能不起作用

 int main() { double E[2000][2000]; // Likely an overflow } 

但是,将arrays移动到静态内存区域

 double E[2000][2000]; int main() { // use E here } 

可能会避免这个问题。