可变大小数组的范围

Scope of variably sized array

本文关键字:范围 数组 小数      更新时间:2023-10-16

它总是按预期运行吗?

char *x;
if (...) {
    int len = dynamic_function();
    char x2[len];
    sprintf(x2, "hello %s", ...);
    x = x2;
}
printf("%sn", x);
// prints hello


编译器(在我的例子中是GCC(如何在C和C++中实现可变大小的数组?

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

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

此处解释范围:

跳过或突破数组名称的作用域将取消分配存储不允许跳入范围;你得到了一个错误

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

否,原因有两个:

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

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

来自C11,6.2.4/2:

如果对象在其生存期之外被引用,则该行为是未定义的。

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

对于这样一个具有可变长度数组类型的对象,其生存期从对象的声明,直到程序的执行离开公告