我有一种情况,我希望我的程序能够读取一些数字来定义二维数组的大小(用作矩阵)。我原本认为,要做到这一点的唯一方法是使用一个malloc
调用把阵列上堆,是这样的:可以使用一个变量来定义栈中数组的大小c?
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试图支持它一段时间,它显然是甚至到4.3版本(http://gcc.gnu.org/gcc-4.3/c99status.html) – 2009-11-02 19:06:21
+1,是绝对正确的。这可能是C99中最有争议的一个。 – 2009-11-02 19:07:01
请注意,你的堆栈通常比你的堆小得多。如果你想动态调整任何实际大小的数组,使用malloc()可能是一个好主意。还要记住,像所有本地(非静态)对象一样,这些数组一旦你的函数返回就会消失。 – 2009-11-02 19:15:43