可变大小数组的范围
Scope of variably sized array
它总是按预期运行吗?
char *x;
if (...) {
int len = dynamic_function();
char x2[len];
sprintf(x2, "hello %s", ...);
x = x2;
}
printf("%sn", x);
// prints hello
编译器(在我的例子中是GCC(如何在C和C++中实现可变大小的数组?
否。x2
是if
语句作用域的本地,您可以使用指针在其外部访问它。这会导致未定义的行为。
顺便说一句,VLA在C11中是可选的,从来没有成为C++的一部分。所以最好避免它。
此处解释范围:
跳过或突破数组名称的作用域将取消分配存储不允许跳入范围;你得到了一个错误
在您的情况下,数组超出了范围。
否,原因有两个:
C++:代码不是有效的C++。C++中的数组必须具有编译时常量大小。
C:否,因为数组只存在到声明它的块的末尾,因此取消引用x
是未定义的行为。
来自C11,6.2.4/2:
如果对象在其生存期之外被引用,则该行为是未定义的。
6.2.4/7表示可变长度数组从其声明一直存在到其封闭范围结束:
对于这样一个具有可变长度数组类型的对象,其生存期从对象的声明,直到程序的执行离开公告
相关文章:
- 并行用于C++17中数组索引范围内的循环
- 在函数范围内在堆栈上分配的数组在离开函数时是否总是被释放?
- 基于字节数组生成静态范围整数值
- 在C++中使用变量而不是"#define"来指定数组大小是不是一种糟糕的做法?(C错误:在文件范围内
- 使用基于数组和范围的 For 循环替换一些基本代码行
- C++中循环和 C 样式数组的范围工作
- Excel 不愉快地显示大型 2D 范围公式数组
- 变量未在此范围内声明 数组线性搜索
- 如何使用基于范围的for循环迭代Rapidjson文档(它本身就是一个JSON数组)
- 对于多个查询,查找在 l 到 r 范围内具有相同元素的最长公共子数组
- 基于多维标准::数组的范围
- 从文件中读取选定的行范围并存储到数组中
- 从原始指针(衰减的 C 样式数组)和大小生成范围::视图
- C++ 如何在给定范围内将数组中的数字相加?
- 给定数组范围的选择排序问题
- C++ 从指定范围内的文件中读取数组
- 数组不会存储超出第一个空间的范围
- gcc8.2如何启用警告:数组下标在数组范围之上[-warray-bounds]
- 数组中的"Maximum Sum mod M"范围:求和和计数
- 检查一对值是否位于范围数组中的范围之间