2011-10-26 16 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; 
} 

Ten program jest przyczyną błędu segmentacji, ale jeśli zdefiniuję N jako 1023, program będzie działać poprawnie. Dlaczego tak się dzieje?Usterka segmentacji, duże tablice

+0

W każdym razie wypełniasz tylko główną diagona l macierzy a i b. –

+0

AurelioDeRosa, to tylko przykład, w moim programie napotkałem podobny problem. –

Odpowiedz

27

Przepełniasz stos. 2 * 1024 * 1024 * sizeof(int) to dużo dla większości systemów.

Najprostszym rozwiązaniem byłoby utworzenie macierzy static.

static int a[N][N]; 
static int b[N][N]; 

Inne metody:

  • podjęciu tablic globalnych (jest to w zasadzie takie same jak powyżej)
  • Zastosowanie malloc w pętli i oczywiście pamiętać, aby free

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

dziękuję, jego pomoc –

+0

@AlexeyMatveev LUB możesz powiedzieć kompilatorowi, że da ci większy stack! Jest na to opcja! – xanatos

+1

@xanatos: niekoniecznie jest to zależne od kompilatora - w wielu środowiskach rozmiar stosu określany jest w czasie wykonywania –