Ошибка сегментации, большие массивы - PullRequest
18 голосов
/ 26 октября 2011
#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, программа будет работать правильно. Почему это происходит?

1 Ответ

29 голосов
/ 26 октября 2011

Вы переполняете стек.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]);
    
...