可变大小阵列的范围

时间:2013-01-17 22:07:33

标签: c++ c gcc

这总是按预期运行吗?

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 ++中实现可变大小的数组?

3 个答案:

答案 0 :(得分:5)

没有。 x2if语句范围的本地,您可以使用指针在其外部访问它。这会导致未定义的行为。

顺便说一句,在C11中,VLA已经成为可选项,并且从未成为C ++的一部分。所以最好避免它。

答案 1 :(得分:2)

范围说明here

  

跳出或超出数组名称的范围释放   存储。不允许跳入范围;你收到一个错误   消息吧。

在你的情况下,数组超出了范围。

答案 2 :(得分:2)

不,原因有两个:

C ++:代码无效C ++。 C ++中的数组必须具有编译时常量。

C:不,因为数组只存在于声明它的块的末尾,因此取消引用x是未定义的行为。

来自C11,6.2.4 / 2:

  

如果在其生命周期之外引用对象,则行为未定义。

6.2.4 / 7表示可变长度数组从其声明到其封闭范围的结束:

  

对于具有可变长度数组类型的对象,其生命周期从   对象的声明,直到程序的执行离开了范围   声明。