按Enter后数组输入变为0

时间:2016-11-24 06:31:12

标签: c++

#include <iostream>
using namespace std;
 int main() {
        int start_time[3];
        int final_time[3];

        int i;
        for(i=0;i<3; i++)
            cin >> start_time[i];

        for(i=0;i<3;i++)
            cin >> final_time[i];

        int a[10];
        for(i=0;i<=10;i++)
            a[i]=0;

        for(i=0;i<3;i++){
            cout << start_time[i] << " " << final_time[i] << endl;
        }



    }

如果我提供以下输入:

23 53 09
23 53 10 

我们看到输出是:

23 0
53 53 
9 10

为什么按下回车键后,final_time的起始输入等于0?

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

您通过对数组a

的超出范围的索引调用未定义的行为

for循环

for(i=0;i<=10;i++)
        ~~~
对于10个元素,

应使用i < 10从0到9进行索引

答案 1 :(得分:1)

    int a[10];
    for(i=0;i<=10;i++)
        a[i]=0;

在这部分中,您要将0写入a[10]。但a[10]不存在。 a[]只有10个整数的空间,索引为0到9.所以你在内存中的某个地方写了零,并且你偶然覆盖了final_time[0]。可能是别的东西或者可能会破坏你的程序。

通过将循环更正为for(i=0;i<10;i++)来解决此错误。

在C ++中写入数组中已分配的边界是未定义的行为。这基本上意味着它没有在标准中定义,并且每个编译器供应商都必须为他们的产品做一些事情,如果你这样做会发生什么。因此它相当随机,因此很糟糕(tm)。切换编译器时可能会出现不同的行为,重启程序时甚至可能会出现不同的行为。在您的情况下,您的编译器供应商(像许多其他人一样)决定他们不会检查开发人员是否正确。如果它存在,它们只会将a[10] 所在的内存空间写入零。但事实并非如此。通过偶然的机会,在记忆中的那个位置还有另一个变量。因此,一个人的价值被零覆盖了。