我不断使用以下代码进行细分。将4000更改为1000可使代码运行正常。我觉得我这里有足够的记忆......我怎么能解决这个问题?
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#define MAXLEN 4000
void initialize_mx(float mx[][MAXLEN])
{
int i, j;
float c=0;
for(i=0;i<MAXLEN;i++){
for(j=0;j<MAXLEN;j++) mx[i][j]=c;
}
}
int main(int ac, char *av[])
{
int i, j;
float confmx[MAXLEN][MAXLEN];
initialize_mx(confmx);
return 0;
}
答案 0 :(得分:3)
问题是你堆满了。
当你调用initialize_mx()
时,它会为它的局部变量(在你的情况下为confmx)分配堆栈空间。如果局部变量太大,这个空间受操作系统的限制(如果你在linux上,请检查ulimit)可能会溢出。
基本上你可以:
initialize_mx()
编辑:刚才意识到如果传递一个指针你仍然必须分配内存空间,那么你有这两个选项:)
答案 1 :(得分:1)
你在堆栈上使用4000 * 4000 * 4字节,如果我没有出现任何计算错误,那就是61MB,这很多。它适用于1000,因为在这种情况下,你的堆栈只使用了近4MB。
答案 2 :(得分:1)
4000*4000*sizeof(float)==64000000
。我怀疑你的操作系统可能有4到64 MB之间的堆栈大小限制。
答案 3 :(得分:0)
正如其他人所说,对于在堆栈上分配的auto
类变量,smallish不小。
根据您的需要,您可以
static float confmx[MAXLEN][MAXLEN];
将在BSS中分配存储。您可能想要考虑不同的存储系统,因为通常只需要一个稀疏矩阵,并且存在更有效的方法来存储和访问许多单元格为零的矩阵。