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 个整数的数组! 索引01234

原因是元素如何存在于内存中。索引告诉您从数组的开头跳转多少个点。所以第一个元素,你要跳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++程序在迭代到数组的最后一个元素时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

c++迭代器在迭代向量时崩溃

如何在 C++ 中分配一个大的动态数组?

C++中的向量迭代器

C++基于范围的for循环详解

C++ STL list迭代器

为太多动态分配的数组赋值时程序崩溃 - C++