分段错误,大数组

29
#include <stdio.h>
#define N 1024
int main(){
  int i, j;
  int a[N][N];
  int b[N][N];
  for (i=0;i<N;i++){
    a[i][i]=i;
    b[i][i]=i;
  }
  for (i=0;i<N;i++)
    for(j=0;j<N;j++)
    {
         printf("%d", a[i][j]);
         printf("%d", b[i][j]);
    }
  return 0;
}

这个程序导致了段错误,但如果我将N定义为1023,程序就能正常工作。为什么会发生这种情况?


AurelioDeRosa,这只是一个例子,在我的程序中我遇到了类似的问题。 - Alexey Matveev
1个回答

40
你的堆栈溢出了。对于大多数系统来说,2 * 1024 * 1024 * sizeof(int) 太大了。
最简单的解决方案是将数组设置为static
static int a[N][N];
static int b[N][N];

其他方法:

  • 将数组设置为全局变量(本质上与上述方法相同)
  • 在循环中使用 malloc,并当然要记得 free

int **a = malloc(N * sizeof *a);
for (i = 0; i < N; i++)
    a[i] = malloc(N * sizeof *a[i]);

1
@AlexeyMatveev 或者你可以告诉编译器给你一个更大的堆栈!有一个选项可以这样做! - xanatos
2
@xanatos:这并不一定取决于编译器 - 在许多环境中,堆栈大小是在运行时确定的。 - Paul R
继@PaulR之后,例如在Unix上可以使用ulimit -s来设置。 - cnicutar
static int p[20000000]; 会导致以下错误:变长数组声明不能具有“静态”存储期。这与建议有何不同? - Michal
@Michal 不会的。当你在 变长数组 中使用 static 关键字时,才会出现那个错误。 - Spikatrix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接