阵列输入在按Enter成为0

Array input after pressing enter becoming 0

本文关键字:成为 Enter 输入 阵列      更新时间:2023-10-16
#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

为什么在我按Enter?

之后,最终_time的启动输入等于0

如何解决此问题?

    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] 在内存中的空间中写入零,如果它存在。但事实并非如此。从很明显的情况下,该位置在内存中有另一个变量。这样一个人的价值被零覆盖。

您正在通过无界索引来调用不确定的行为,以征集数组a

for循环

for(i=0;i<=10;i++)
        ~~~

应使用i < 10到10元素的0到9索引