1

这总是会按预期运行吗?

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

4

3 回答 3

5

No.在语句的范围内x2是本地if的,您可以使用指针在它之外访问它。这会导致未定义的行为。

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

于 2013-01-17T22:12:23.643 回答
2

范围在这里解释:

跳出或超出数组名称的范围会释放存储空间。不允许跳入范围;您会收到一条错误消息。

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

于 2013-01-17T22:11:31.093 回答
2

不,有两个不同的原因:

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

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

从 C11,6.2.4/2 开始:

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

并且 6.2.4/7 说可变长度数组从它的声明到它的封闭范围结束:

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

于 2013-01-17T22:14:34.567 回答