Ошибка ошибки сегментации с двумерным массивом - PullRequest
2 голосов
/ 19 декабря 2011

Произошла странная ошибка сегментации. Следующий код работает нормально

#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;
}

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

#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;
}

Какова потенциальная причина?

Ответы [ 2 ]

10 голосов
/ 19 декабря 2011

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

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

ulimit -s unlimited

и перезапустить, если вы работаете в системе Linux с использованием bash (или sh).

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

0 голосов
/ 20 декабря 2011

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

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

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

Примечание:

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