2015-11-22 3 views
1

Я должен потерять рассудок здесь. Я получаю segfault на линии for(i = 0; i < N; i++) {. Я никогда не встречал ничего подобного. Вот полный код:Segfault при инициализации простого цикла для цикла

#include <stdio.h> 
#include <time.h> 

#define N 2400 
#define M 2000 
#define P 500 

int main() {  
    int a[N][N]; 
    int b[N][N]; 
    int c[N][N]; 

    int i, j; 

    // Initialize matrix A 
    for(i = 0; i < N; i++) { 
     for(j = 0; j < M; j++) { 
      a[i][j] = j-1+2; 
     } 
    } 

    // Initialize matrix B 
    for(i = 0; i < M; i++) { 
     for(j = 0; j < P; j++) { 
      b[i][j] = i-j+1; 
     } 
    } 
} 
+9

Большинство компиляторов помещают локальные переменные, включая полные массивы, в стек. Объем стека ограничен, в Windows стековое пространство по умолчанию - всего один мегабайт. Ваши массивы 'a',' b' и 'c' равны 21 МБ, * каждый *. –

+1

... поэтому вы должны использовать 'malloc()' или 'calloc()' для выделения памяти [в куче] (https://en.wikipedia.org/wiki/C_dynamic_memory_allocation) для этих массивов. Или просто уменьшите количество элементов, чтобы вписаться в стек. –

+1

Фактически вы получаете его в 'int a [N] [N];' – ThunderWiring

ответ

1

Во-первых: вы объявили а, Ь и с как [N] [N] матрица, но инициализировать их, как если бы они были [N] [M] и [M] [ P]. Учитывая N> M> P, это не должно вызывать segfault, но намерение не ясно.

Во-вторых, если вы замените defines на:

#define N 10 
#define M 5 
#define P 2 

вашу работу программы. Это связано с тем, что локальные переменные a и b хранятся в стеке, а ваш стек ограничен по размеру. Проконсультируйтесь со своим компилятором и вашей системной документацией, чтобы точно знать введенные ограничения.

Чтобы избежать такой проблемы, выделите свою память с помощью malloc или эквивалентной функции, которая выделяет память в куче, которая менее ограничена.

Смежные вопросы