【问题标题】:For loop with an array带有数组的for循环
【发布时间】: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 )。这不是我想到的,也不是在寻找发生这种情况的原因时发现的。

【问题讨论】:

标签: c++ arrays loops for-loop


【解决方案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 容器与普通数组的功能相同,但提供了有用的方法

【讨论】:

    【解决方案2】:

    您正在打印内存中的随机值,因为变量 a 未初始化。未初始化的变量在内存中具有随机值。你想做什么?

    【讨论】:

      【解决方案3】:

      在计算机中,数组实际上只是给定数量的值,从数组 [0] 开始,到数组 [n] 结束。 int a[5]; 在堆栈上为 5 个整数静态分配空间,从 a[0] 开始,到 a[4] 结束。 试试这个迭代:

      for (int i = 0; i < 4; i++)
      

      【讨论】:

        【解决方案4】:

        除了不初始化数组 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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-03-02
          • 2022-01-04
          • 2017-01-17
          • 2014-02-05
          • 2012-05-05
          • 1970-01-01
          • 2013-12-27
          • 2014-02-12
          相关资源
          最近更新 更多