对于带数组的循环

时间:2017-07-23 00:27:21

标签: c++ arrays loops for-loop

#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) )。这不是我想到的,也不是在寻找发生这种情况的原因时发现的。

4 个答案:

答案 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