可变阵列大小的分段故障

时间:2012-01-24 20:55:08

标签: c memory-management segmentation-fault

执行以下操作时,我收到了分段错误。假设我定义了一些网格大小如下。

#define DIM 512

int x = DIM;
int y = DIM;  

现在我想分配一些具有这些尺寸的二维数组

complex double arr[x][y];

这会产生分段错误,此调用

complex double arr[512][512];

运行顺利。我确信这里显而易见的是我在这里失踪了,但如果有人朝着正确的方向迈出了一步,那我肯定是最有责任的。

1 个答案:

答案 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的大小不固定,因此编译器无法为其保留空间。程序试图在堆栈上分配它,但它太大了,所以分配会导致段错误。