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

Chương trình này là lý do lỗi phân đoạn, nhưng nếu tôi xác định N là 1023, chương trình sẽ hoạt động chính xác. Tại sao nó xảy ra?Lỗi phân đoạn, mảng lớn

+0

Dù sao bạn chỉ điền vào diagona chính l của ma trận a và b. –

+0

AurelioDeRosa, đó là ví dụ duy nhất, trong chương trình của tôi mà tôi gặp phải với sự cố tương tự. –

Trả lời

27

Bạn đang tràn ngăn xếp. 2 * 1024 * 1024 * sizeof(int) là rất nhiều cho hầu hết các hệ thống.

Giải pháp đơn giản nhất là tạo các mảng static.

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

Các phương pháp khác:

  • Tận dụng mảng toàn cầu (điều này về cơ bản là tương tự như trên)
  • Sử dụng malloc trong một vòng lặp và tất nhiên nhớ tới free

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

cảm ơn bạn, sự giúp đỡ của nó –

+0

@AlexeyMatveev HOẶC bạn có thể yêu cầu trình biên dịch cung cấp cho bạn một ngăn xếp lớn hơn! Có một lựa chọn cho điều đó! – xanatos

+1

@xanatos: nó không nhất thiết phải lên đến trình biên dịch - trong nhiều môi trường kích thước ngăn xếp được xác định tại thời gian chạy –