这总是按预期运行吗?
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 ++中实现可变大小的数组?
答案 0 :(得分:5)
没有。 x2
是if
语句范围的本地,您可以使用指针在其外部访问它。这会导致未定义的行为。
顺便说一句,在C11中,VLA已经成为可选项,并且从未成为C ++的一部分。所以最好避免它。
答案 1 :(得分:2)
答案 2 :(得分:2)
不,原因有两个:
C ++:代码无效C ++。 C ++中的数组必须具有编译时常量。
C:不,因为数组只存在于声明它的块的末尾,因此取消引用x
是未定义的行为。
来自C11,6.2.4 / 2:
如果在其生命周期之外引用对象,则行为未定义。
6.2.4 / 7表示可变长度数组从其声明到其封闭范围的结束:
对于具有可变长度数组类型的对象,其生命周期从 对象的声明,直到程序的执行离开了范围 声明。