2011-10-26 155 views
15
#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,程序将正常工作。为什么会发生?分割错误,大阵列

+0

无论如何,你只填写主diagona l的矩阵a和b。 –

+0

AurelioDeRosa,这只是我遇到类似问题的程序中的一个例子。 –

回答

27

您正在溢出堆栈。 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]); 
    
+0

谢谢,其帮助 –

+0

@AlexeyMatveev或者你可以告诉编译器给你一个更大的堆栈!有一个选项! – xanatos

+1

@xanatos:它不一定取决于编译器 - 在许多环境中,堆栈大小是在运行时确定的 –