2011-08-05 45 views
1

我不断用下面的代码得到分割。将4000更改为1000使代码运行良好。我会认为我在这里有足够的记忆......我该如何解决这个问题?小(ish)2d阵列上的分割错误

#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

@berry:你不能用malloc初始化一个数组类型,只能使用指针类型。 –

+0

@Dietrich Epp对不起,你当然是砰的一声。显示我的C是多么生疏(以及为什么我不应该在累了的时候发布临时评论!) – berry120

回答

3

问题是你溢出堆栈。

当你调用initialize_mx()它为它的局部变量(confmx在你的情况下)分配堆栈空间。如果局部变量太大,这个空间会受到操作系统的限制(如果你在linux上,请检查ulimit)。

基本上就可以:

  1. 申报confmx作为作为cnicutar提出一个全局变量。
  2. Allocate memory space for your array dynamically.和一个指针传递给initialize_mx()

编辑:刚刚意识到你仍然必须分配内存空间,如果您传递一个指针,所以你有这两个选项:)

+2

考虑到这个网站被称为StackOverflow,这是一个非常合适的问题。

+0

这是我在SO的第一个问题,我使用了我正在链接的教程作为了解我的问题的指南;) – kirbuchi

1

如果我没有做任何计算错误,那么你在栈上使用4000 * 4000 * 4字节,这是61MB,这是很多。它适用于1000,因为在这种情况下,你的堆栈上只使用了近4MB。

1

4000*4000*sizeof(float)==64000000。我怀疑你的操作系统可能对4到64 MB的堆栈大小有限制。

0

正如其他人指出短小ISN”对于分配在堆栈上的类变量auto小。

根据您的需求,您可以

static float confmx[MAXLEN][MAXLEN]; 

这将分配在BSS存储。你可能想考虑一个不同的存储系统,因为人们通常只需要一个稀疏矩阵,并且有更多有效的方法来存储和访问许多单元为零的矩阵。