我昨天刚刚做完一个实验,发现了一些令人困惑的事情:
#include <stdio.h>
int main()
{
int j;
scanf("%d",&j);
const int i = j;
int arr[i];
return 0;
}
从键盘读取数字 j
,然后用它在堆栈上分配数组 arr
。
编译器甚至不知道数组的大小(将 j 初始化为 0?),但没有编译错误。这怎么可能呢?
我昨天刚刚做完一个实验,发现了一些令人困惑的事情:
#include <stdio.h>
int main()
{
int j;
scanf("%d",&j);
const int i = j;
int arr[i];
return 0;
}
从键盘读取数字 j
,然后用它在堆栈上分配数组 arr
。
编译器甚至不知道数组的大小(将 j 初始化为 0?),但没有编译错误。这怎么可能呢?
-Wpedantic
)或错误(-Werror
或-pedantic-errors
)。请查阅您的编译器文档。如果您想深入了解在堆栈上分配变量内存的工作原理,请参阅这篇关于编译器如何实现(非标准)alloca()
函数的文章:
C99标准提供了可变长度数组("VLA"),并具有基本相同的功能;尽管内存是按作用域而不是按函数基础回收的:
使用不受限制的大小时,有一些原因会让人犹豫不决。无法像通过malloc()
测试堆内存是否可用那样检查堆栈内存是否可用。如果您的变长数组太大,它将导致堆栈溢出和未定义行为;对于堆栈分配的两种方法都是如此。
C语言有一个叫做"变长数组(Variable Length Arrays)"的特性,它可以让我们在运行时动态定义自动存储期的数组。
i
是没有必要的,代码在没有它的情况下也可以正常运行。 - Jens Gustedt