执行以下操作时,我收到了分段错误。假设我定义了一些网格大小如下。
#define DIM 512
int x = DIM;
int y = DIM;
现在我想分配一些具有这些尺寸的二维数组
complex double arr[x][y];
这会产生分段错误,此调用
complex double arr[512][512];
运行顺利。我确信这里显而易见的是我在这里失踪了,但如果有人朝着正确的方向迈出了一步,那我肯定是最有责任的。
答案 0 :(得分:1)
静态定义数组时:
complex double arr[512][512];
编译器知道它有多大,所以它会适当地保留内存。但是,当您可变地声明数组时,
complex double arr[x][y];
你只能在一个函数中执行此操作,编译器无法知道它有多大,所以它无法为它保留适当的空间。该空间将在堆栈上分配,您的堆栈显然没有该阵列所需的4MB。
前:
double arr1[10240][10240];
int main() {
double arr2[10240][10240];
int i = 10240;
int j = 10240;
double arr3[i][j];
}
arr3
在运行时会导致段错误,将其注释掉它会起作用。 arr1
放在数据部分,arr2
放在堆栈上,但堆栈大到足以容纳它(编译器可以做,因为它已知大小)。但是,arr3
的大小不固定,因此编译器无法为其保留空间。程序试图在堆栈上分配它,但它太大了,所以分配会导致段错误。