【发布时间】:2013-03-31 00:38:21
【问题描述】:
根据this answer,其中规定:
编译器知道 int 类型的大小,因此可以生成 正确的汇编指令将保留足够的空间 堆栈以便让 foo 住在那里。
编译器需要知道函数在堆栈上占用的大小才能实现它。
那么,这段代码为什么会编译呢?
int f(int n)
{
int x[n];
}
int main()
{
f(3);
f(5);
//etc
}
x 是一个整数数组,但它的大小不是恒定的,它可以在函数被调用的任何时候改变。
我在这里错过了什么?
【问题讨论】:
-
用
-pedantic再次编译。 -
"erw.cpp: In function 'int f(int)': erw.cpp:3:12: warning: ISO C++ forbids variable length array 'x' [-Wvla]" - @chris : 谢谢,现在说得通了。
-
在堆栈上为 x 分配空间只是从 esp(堆栈指针)中减去 sizeof(int)*n 的问题。语义是问题 - 就像初始化枚举 {Ok = sizeof(x)} 的情况一样。可能直到出现禁止的语义使用,您的编译器才允许此类使用。
-
@MSalters:抱歉,回滚了。问题是关于 C++,而不是 C99,Luchian Grigore 的回答和我的回答都是针对这类问题(“为什么我可以这样做,为什么它会编译?这不是非法的吗?”)。尽管“编译器如何实现 VLA”这个问题也很有趣,但这并不是 OP 最初的意思。
标签: c++ arrays function memory integer