带有数组的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多维数组-无法正常工作