小(ish)2d阵列的分段故障

时间:2011-08-05 23:46:04

标签: c arrays segmentation-fault

我不断使用以下代码进行细分。将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;
}

4 个答案:

答案 0 :(得分:3)

问题是你堆满了。

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

基本上你可以:

  1. 如cnicutar所暗示的那样将confmx声明为全局变量。
  2. Allocate memory space for your array dynamically.并将指针传递给initialize_mx()
  3. 编辑:刚才意识到如果传递一个指针你仍然必须分配内存空间,那么你有这两个选项:)

答案 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中分配存储。您可能想要考虑不同的存储系统,因为通常只需要一个稀疏矩阵,并且存在更有效的方法来存储和访问许多单元格为零的矩阵。