2011-10-26 156 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:它不一定取決於編譯器 - 在許多環境中,堆棧大小是在運行時確定的 –