【发布时间】:2009-11-02 18:57:42
【问题描述】:
我有一种情况,我希望我的程序读取一些数字,这些数字将定义二维数组(用作矩阵)的大小。我最初认为这样做的唯一方法是使用malloc 调用将数组放在堆上,如下所示:
matrixElement* matrix = malloc(sizeof(matrixElement) * numRows * numCols);
其中 numCols 和 numRows 是之前读入的整数,matrixElement 是一些任意类型。我的理由是简单地写:
matrixElement matrix[numRows][numCols];
不起作用,因为编译器无法知道要为函数调用分配多少堆栈空间。事实证明我错了,因为下面的代码编译并运行:
#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;
}
为 x 和 y 输入足够大的数字后,这最终会产生段错误,但我也很惊讶我可以用这段代码创建一个 1000x1000 的数组。
谁能解释这里发生了什么?
编译器是否只是为数组分配了一堆空间,即使它不知道将使用多少?
这种行为是由 ANSI C 指定的,还是只是 gcc 自己在做的事情?
【问题讨论】: