【发布时间】:2017-07-23 00:27:20
【问题描述】:
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int a[5];
for (int i = -1; i < 7; i++)
cout << i << " " << setw(2) << a[i] << endl;
}
所以我想弄清楚为什么这不起作用。如果我取出 a[i] 它可以工作,但如果我把它留在里面,for 循环会从 -2 到 1000,这显然是不正确的。是不是因为 a[i] 没有绑定到 for 循环的参数(i
编辑正如你们中的许多人所解释的那样,这是取消初始化数组和使用数组外的边界(例如 -2 )。这不是我想到的,也不是在寻找发生这种情况的原因时发现的。
【问题讨论】:
-
看起来
a没有被初始化。 -
a[-1]、a[5]和a[6]正在越界访问a。那是未定义的行为。 -
这里有两种未定义的行为:访问数组中的无效索引,以及使用未初始化的值。 “不工作”不足为奇(但不能保证)。
-
您好,欢迎来到 StackOverflow。请花一些时间阅读帮助页面,尤其是名为"What topics can I ask about here?" 和"What types of questions should I avoid asking?" 的部分。更重要的是,请阅读the Stack Overflow question checklist。您可能还想了解Minimal, Complete, and Verifiable Examples。
-
a的内存仅从a->a+4分配,而不是a-1->a+6。并且默认情况下不会初始化自动分配的原语,您应该在编译时发出警告;你已经调用了 ub,所以……害怕 :)