Ошибка сегментации с переменными размерами массива - PullRequest
0 голосов
/ 25 января 2012

Я получаю ошибку сегментации при выполнении следующего действия. Скажем, я определил некоторый размер сетки следующим образом.

#define DIM 512

int x = DIM;
int y = DIM;  

Теперь я хочу выделить некоторый 2D-массив с этими размерами

complex double arr[x][y];

Это вызывает ошибку сегментации, где, как этот вызов

complex double arr[512][512];

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

1 Ответ

1 голос
/ 25 января 2012

Когда вы определяете массив статически:

complex double arr[512][512];

Компилятор знает, насколько он будет большим, поэтому он резервирует память соответствующим образом.Однако, когда вы объявляете массив по-разному,

complex double arr[x][y];

, который вы можете сделать только внутри функции, компилятор не может знать, насколько он будет большим, поэтому он не может зарезервировать соответствующее пространство дляЭто.Пространство будет выделено в стеке, и у вашего стека, очевидно, нет 4 МБ, требуемых для этого массива.

Пример:

double arr1[10240][10240];

int main() {
        double arr2[10240][10240];
        int i = 10240;
        int j = 10240;
        double arr3[i][j];
}

arr3 вызывает ошибку сегмента при запуске,закомментируйте это, и это будет работать.arr1 помещается в секцию данных, arr2 помещается в стек, но стек сделан достаточно большим, чтобы вместить его (что может сделать компилятор, поскольку он имеет известный размер).Однако arr3 не имеет фиксированного размера, поэтому компилятор не может зарезервировать для него место.Программа пытается выделить его в стеке, но он слишком большой, поэтому выделение вызывает ошибку segfault.

...