我在一些书中读到,用于声明可变长度数组的变量必须具有自动存储类。
有人可以解释一下为什么它需要带有自动存储类的变量吗?
是否可以在堆栈或堆中分配可变长度数组的空间?
答案 0 :(得分:2)
Rationale for International Standard—Programming Languages—C中说明了这一点:
必须在块范围或函数原型范围内声明所有可变修改类型。 无法使用可变修改类型声明文件范围标识符。此外,阵列 使用静态或外部存储类说明符声明的对象不能使用可变长度数组类型声明[...]
和
将变量长度数组声明符限制为带有的标识符 自文件“变量”以来,自动存储持续时间很自然 范围需要一些参数化类型的概念。有 允许对结构成员进行可变修改的情绪; 但是允许结构成员具有可变长度的数组 类型引入了许多问题,例如通过时的治疗 这些对象,甚至指向这些对象的指针,作为参数。在 另外,offsetof宏的语义也需要 扩展和运行时语义添加。最后,有分歧 是否可以确定可变长度阵列成员的大小 使用其中一个成员。委员会决定限制 变量长度数组类型到结构和结构外的声明 联合。
答案 1 :(得分:0)
错了。 VLA 不必具有自动存储。 您可以创建一个指向 VLA 的指针并动态分配它。
int size = 42;
// automatic VLA
int A[size];
// dynamic VLA
int (*pA)[size] = malloc(sizeof *pA);