我有一种情况,我希望我的程序读取一些数字,这些数字将定义二维数组的大小(用作矩阵).我最初认为,执行此操作的唯一方法是使用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自己做的事情?
此功能已在C99中添加.数组在堆栈上分配的方式类似于调用时的方式alloca().可能存在一些微妙的差异; 检查编译器文档以获取信息.
在海湾合作委员会的文件有其实施的描述.
| 归档时间: |
|
| 查看次数: |
390 次 |
| 最近记录: |