Когда вы определяете массив статически:
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.