c++自引用数组
C++ self-referencing array?
我不小心在程序中通过自引用数组创建了一个错误。下面是一个非常简化的演示程序,在概念上类似:
#include <iostream>
using namespace std;
int kTest[] = {
kTest[0]
};
int main() {
cout << kTest[0] << endl;
}
我很惊讶,我既没有收到一个编译器错误,甚至警告这段代码!在我的例子中,它最终产生了不可预测的输出。它正在访问垃圾内存吗?
我很好奇在什么情况下会有定义良好的输出(如果有的话!)
Edit:如果kTest
是static
会有区别吗?那么const
呢?都有?
int kTest[] = {
kTest[0]
};
类似于
,如果不是完全相同的话int x = x;
如果在函数中局部声明,这将是未定义的行为。
当kTest
是全局变量时,它似乎定义得很好。
我不确定这是未定义的。引用自当前草案:
[basic.start.static]/3
如果没有进行常量初始化,则使用static存储时间([basic.stc.static])或线程存储时间([basic.stc.thread])为零初始化([dcl.init])。在一起,零初始化和常量初始化称为静态初始化;其他所有初始化都是动态初始化。静态初始化应在任何动态初始化发生之前执行。
在我看来,当动态初始化开始时,kTest
已经是零初始化了,所以它可以被定义为初始化为0
。
相关文章:
- 将对象数组的引用传递给函数
- 使用对const结构的const数组的引用进行构造
- 将 char 指针传递给接受对 char 数组的引用的函数
- 如何在C++中使用 new 运算符创建对动态创建的数组的引用?
- 对数组中子数组的引用
- 当数组大小在C++中未知时,如何在运行时将对字符串数组的引用作为函数参数传递?
- 将数组作为引用传递到函数中不起作用
- 使用结构数组取消引用时的分段错误
- 结构数组 - 未引用的局部变量
- shared_ptr<>到数组自定义删除器(带make_shared)
- C++ 对象数组 + 带有引用和指针的参数
- 将对静态存储 cstyle 数组的引用从 constexpr 函数传递到另一个 constexpr 函数
- 从std::array获取对原始数组的引用
- 返回对特定尺寸数组的引用,而无需明确说明返回类型中的大小
- 数组/指针/引用混淆
- 添加到字符串数组和引用
- 如何从指向数组的指针获取对该数组的引用
- 通过对象数组的引用传递
- 返回对结构数组的引用
- 使用模板将数组作为引用作为参数传递