这总是会按预期运行吗?
char *x;
if (...) {
int len = dynamic_function();
char x2[len];
sprintf(x2, "hello %s", ...);
x = x2;
}
printf("%s\n", x);
// prints hello
编译器(在我的例子中是 GCC)如何在 C 和 C++ 中实现可变大小的数组?
No.在语句的范围内x2
是本地if
的,您可以使用指针在它之外访问它。这会导致未定义的行为。
顺便说一句,VLA 在 C11 中是可选的,并且从未成为 C++ 的一部分。所以最好避免它。
不,有两个不同的原因:
C++:代码不是有效的 C++。C++ 中的数组必须具有编译时常量大小。
C:不,因为数组只存在于声明它的块的末尾,因此取消引用x
是未定义的行为。
从 C11,6.2.4/2 开始:
如果对象在其生命周期之外被引用,则行为未定义。
并且 6.2.4/7 说可变长度数组从它的声明到它的封闭范围结束:
对于这种具有可变长度数组类型的对象,它的生命周期从对象的声明开始,直到程序的执行离开声明的范围。