C++程序在迭代到数组的最后一个元素时崩溃
Posted
技术标签:
【中文标题】C++程序在迭代到数组的最后一个元素时崩溃【英文标题】:C++ program crashes on iterating till the last element of an array 【发布时间】:2018-03-03 09:30:59 【问题描述】:我有以下代码:
int main()
int a[5];
for (int i = 0; i <= 5; i++)
cin >> a[i];
for (int i = 0; i <= 5; i++)
cout << a[i] << endl;
该程序应该将 6 个整数作为输入,然后将它们打印到输出。它适用于前五个整数,但在打印第六个整数时崩溃。据我所知,在 C++ 中定义的数组“a[5]”应该有 6 个元素,因为它从 0 开始,对吧?导致崩溃的原因是什么?
【问题讨论】:
"据我所知,在 c++ 中定义的数组“a[5]”应该有 6 个元素,因为它从 0 开始,对吧?“不。它包含5 个元素,即使索引从0
开始。这种数组的最后一个有效索引是4
。考虑向good C++ book学习。
关于您的最新编辑 - 不要在标题中添加“[已解决]”之类的内容。如果它有助于解决问题,请接受答案。
【参考方案1】:
int a[5];
是 5 个整数的数组! 索引是0
、1
、2
、3
、4
。
原因是元素如何存在于内存中。索引告诉您从数组的开头跳转多少个点。所以第一个元素,你要跳0个空格,因为它在数组的最前面。第二个元素,你要跳1格。明白了吗?
array start |data|data|data|data|data|<nothing here!>
offset from start | 0| 1| 2| 3| 4| not allowed!!
因此,通过尝试跳转到数组中实际不存在的位置,您会导致Undefined Behaviour。这意味着你的程序是垃圾。根本无法保证会发生什么。它可能会崩溃,或者更糟的是,它可能看起来工作,因为您实际上碰到了一些真正用于存储完全不同对象的内存。然后你会得到一些很难调试的非常疯狂的行为。
数组上的循环应该如下所示:
for (size_t i = 0; i < arraySize; ++i) // ...
^ always <, never <=
但最好使用std::vector
,它会增长到您需要的大小,并为您管理所有内存。然后您可以使用myVector.at(3);
访问数据,如果您像上面那样犯了错误,它会抛出异常。或者更好的是,使用“基于范围的for
循环”,它将为您提取所有元素:
#include <vector>
#include <iostream>
int main()
const std::size_t howMany = 6; // how many ints to read
std::vector<int> data;
while (data.size() < howMany) // haven't read enough yet
int tmp = 0;
std::cin >> tmp;
if (!std::cin) // somehow reading went wrong!
return 1; // exit the program with an error code
data.push_back(tmp); // store the value we just read
for (int i : data) // go through all the stored ints
std::cout << i << '\n';
(另外,see here 了解您正在犯的一些常见的初学者错误)。
【讨论】:
添加到这个答案:它崩溃的原因是未定义的行为因为你不能指望它总是崩溃。它也可能起作用,或者它可能导致 ww3。 @Neijwiert 好点,谢谢,我会在我的回答中对此进行扩展。以上是关于C++程序在迭代到数组的最后一个元素时崩溃的主要内容,如果未能解决你的问题,请参考以下文章