#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?
我该如何解决这个问题?
答案 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]
所在的内存空间写入零。但事实并非如此。通过偶然的机会,在记忆中的那个位置还有另一个变量。因此,一个人的价值被零覆盖了。