#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;
}
所以我试图弄清楚为什么这不会起作用。如果我拿出一个[i]它可以工作,但是如果我把它留下来,for循环从-2到1000,这显然是不对的。是因为a [i]没有绑定到for循环的参数(i <7)?我不太确定我理解。
编辑正如你们许多人所解释的那样,未初始化数组和使用数组之外的边界(例如-2) )。这不是我想到的,也不是在寻找发生这种情况的原因时发现的。
答案 0 :(得分:1)
首先,正如marcadian所指出的,数组a
未初始化,因此数组中的值完全是随机的。
此外,a
数组的大小为5,这意味着您可以在索引0和4之间进行访问。
但是,在循环中,您尝试在索引-1和索引6处进行访问。尝试在无效索引(例如-1和6,在这种情况下)中进行写入和读取是未完成的行为(它可能会崩溃分段错误,或损坏其他变量,这可能使调试过程非常困难......)
像你一样避免缓冲区溢出的方法是使用std::array
STL容器,如下所示:
std::array<int, 5> a;
//Access elements using the method 'at()', it has bound checking
a.at(0); // 0 is a valid index
//a.at(-1); // -1 is not a valid index, it will crash ( at least in debug mode )
//a.at(6); // 6 is also not a valid index
std::array
STL容器执行与普通数组相同的操作,但提供了有用的方法
答案 1 :(得分:0)
您在内存中打印出随机值,因为未初始化变量a
。未初始化的变量在内存中具有随机值。你想做什么?
答案 2 :(得分:0)
在计算机中,数组实际上只是给定数量的值,从数组[0]开始,到数组[n]结束。
int a[5];
静态地为堆栈上的 5 整数分配空间,从[0]开始,到[4]结束。
请尝试此迭代:
for (int i = 0; i < 4; i++)
答案 3 :(得分:0)
除了不初始化数组之外,a,您将用于访问其元素的索引超出范围。 C ++使用零索引 - 您可以尝试,例如:
int main() {
int a[] = {1, 2, 3, 4, 5};
for (int i = 0; i < 5; i++) {
cout << i << " " << a[i] << endl;
}
}
输出将是:
0 1
1 2
2 3
3 4
4 5