C ++程序在迭代直到数组的最后一个元素时崩溃

问题描述 投票:-3回答:1

我有以下代码:

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++ arrays loops
1个回答
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对你正在犯的一些常见的初学者错误)。

© www.soinside.com 2019 - 2024. All rights reserved.