带有数组的for循环

Posted

技术标签:

【中文标题】带有数组的for循环【英文标题】:For loop with an array 【发布时间】: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。那是未定义的行为。 这里有两种未定义的行为:访问数组中的无效索引,以及使用未初始化的值。 “不工作”不足为奇(但不能保证)。 您好,欢迎来到 ***。请花一些时间阅读帮助页面,尤其是名为"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,所以……害怕 :) 【参考方案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

【讨论】:

以上是关于带有数组的for循环的主要内容,如果未能解决你的问题,请参考以下文章

带有嵌套for循环的Javascript多维数组-无法正常工作

带有键的数组的 Twig for 循环

为啥我的平台不绘制当使用带有数组列表的 for 循环(访问多个平台)时

带有 if 语句的循环的空数组

如何结束带有 for 循环的 while 循环?

加强版for循环