2011-12-19 2 views
2

Существует ошибка ошибки сегментации сегментации. Следующий код работает отличноОшибка сбоя сегментации с 2D-массивом

#include <stdlib.h> 
#include <stdio.h> 
main() 
    { 
    int matrixSize = 1000; 
    int i,j; 

    double a[matrixSize][matrixSize]; 
    for (i = 0; i < matrixSize; i++) 
     for (j = 0; j < matrixSize; j++) 
      a[i][j] = rand() % 10; 

     double b[matrixSize][matrixSize]; 
    for (i = 0; i < matrixSize; i++) 
     for (j = 0; j < matrixSize; j++) 
      b[i][j] = rand() % 10; 
    return 0; 
} 

Но когда я пытаюсь инициализировать еще один 2D массив, я получаю «ошибку сегментации» исключение:

#include <stdlib.h> 
#include <stdio.h> 
main() 
{ 
    int matrixSize = 1000; 
    int i,j; 

    double a[matrixSize][matrixSize]; 
    for (i = 0; i < matrixSize; i++) 
     for (j = 0; j < matrixSize; j++) 
      a[i][j] = rand() % 10; 

    double b[matrixSize][matrixSize]; 
    for (i = 0; i < matrixSize; i++) 
     for (j = 0; j < matrixSize; j++) 
      b[i][j] = rand() % 10; 

    return 0; 
} 

Какова возможная причина?

+6

Два примера кода являются одинаковыми. – kennytm

+0

Почему это отмечено как C++? – shuttle87

+0

Я удалил тег C++. – tpg2114

ответ

10

Скорее всего вы превышаете размер стека.

В терминале вы используете для запуска этого, попробуйте ввести

ulimit -s unlimited

и повторного запуска, если вы находитесь на системе Linux с помощью Баш (или ш).

Если вам нужно использовать массивы такого размера, вы можете сделать их динамическими, чтобы они находились в куче, а не в стеке, если по какой-то причине изменение размера стека является проблематичным.

0

Как указано в tpg2114, выделение как больших матриц - не очень хорошая идея. Проще всего выделить его как то

double (*a)[matrixSize] = malloc(sizeof(double[matrixSize][matrixSize])); 
. 
free(a); 

Затем вы можете продолжать использовать вложенные for петли для инициализации без проблем, как и раньше.

NB:

  • , так как вы используете переменную для размеров Ваша матрица является технически переменная массив длины, который доступен только с C99
  • ваше определение main не соответствует стандарту. В вашем случае вы должны использовать int main(void) { ... }. поскольку соответствующий компилятор должен зафиксировать это, похоже, что вы не используете правильные параметры для своего компилятора или игнорируете предупреждения, которые он вам дает.
  • , поскольку они представляют размеры, ваши переменные matrixSize, i и j должны быть типа size_t и не int.
Смежные вопросы