可以使用变量来定义c中堆栈上数组的大小吗?

Gra*_*oob 4 c arrays

我有一种情况,我希望我的程序读取一些数字,这些数字将定义二维数组的大小(用作矩阵).我最初认为,执行此操作的唯一方法是使用malloc调用将数组放在堆上,如下所示:

matrixElement* matrix = malloc(sizeof(matrixElement) * numRows * numCols);
Run Code Online (Sandbox Code Playgroud)

其中numCols和numRows是前面读过的整数,而matrixElement是一些任意类型.我的理由只是写作:

matrixElement matrix[numRows][numCols];
Run Code Online (Sandbox Code Playgroud)

因为编译器无法知道要为函数调用分配多少堆栈空间,所以无法工作.事实证明我错了,因为以下代码编译并运行:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int x, y;
    scanf("%d", &x);
    scanf("%d", &y);

    double arr[x][y];

    printf("Made an array of size %d by %d, total memory %fKb\n", 
            sizeof(arr) / sizeof(arr[0]), 
            sizeof(arr[0]) / sizeof(arr[0][0]),
            (float) sizeof(arr) / 1024.0f);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

对于x和y有足够大的数字输入,这最终会产生段错误,但我也非常惊讶地看到我可以使用此代码创建一个1000x1000数组.

谁能解释一下这里发生了什么?

编译器是否只是为数组分配了一堆空间,即使它不知道将使用多少空间?

这种行为是由ANSI C指定还是只是gcc自己做的事情?

Car*_*rum 8

此功能已在C99中添加.数组在堆栈上分配的方式类似于调用时的方式alloca().可能存在一些微妙的差异; 检查编译器文档以获取信息.

海湾合作委员会的文件有其实施的描述.

  • 但请注意,对此的支持非常不稳定.即使在GCC已经试图支持它一段时间了,它显然是非常错误甚至通过版本4.3(http://gcc.gnu.org/gcc-4.3/c99status.html) (2认同)
  • 请注意,您的堆栈通常比堆小得多.如果你想要任何实际大小的动态大小的数组,使用malloc()可能是一个好主意.还要记住,就像所有本地(非静态)对象一样,一旦函数返回,这些数组就会消失. (2认同)