Int数组给出疯狂的值,除非所有字段初始化为0,为什么?

int array gives crazy values unless all fields initialized to 0, why?

本文关键字:字段 初始化 为什么 数组 疯狂 Int      更新时间:2023-10-16
int TwoThrows();

int main(){
        int Throws, Throw, Frequency[13]={0,0,0,0,0,0,0,0,0,0,0,0,0};
        randomize();

        cout << "nThis program simulates throws of two dice.";
        cout << "nnHow many throws : ";
        cin >> Throws;

        // Calls TwoThrows and saves in Frequency by value
        for(int I=0; I<Throws; I++){
                Throw=TwoThrows();   //2-12
                Frequency[Throw]++;   //2-12
        }
         // Prints array:
        for(int I=0; I<11; I++){
                cout << I+2 << ":t" << Frequency[I+2] << "n";
        }
        return 0;
}
int TwoThrows(){
        unsigned int I=(random(6)+1)+(random(6)+1);
        return I;
}
这个打印

:

2: 13173: 27244: 41455: 55136: 70567: 83438: 69829: 558010: 417611: 277612: 1388

这很好。

然而,我想知道的是,为什么我必须将数组设置为{0,0,0,0,0,0,0,0,0,0,0}?

如果我不这样做;我:

2: 306268683: 16382334: 8445452955: 16: 97: 42025108: 41991979: 84455575710: 311: 420257412: 2130567168

如果你不初始化数组,然后继续增加它的元素,从技术上讲,这是未定义的行为。

实际情况是,当main()开始时,数组的元素得到堆栈上的任何值。

局部变量放在函数的堆栈上。编译器或操作系统不会初始化该区域。这意味着局部变量的值正是调用函数时内存中的值,这可能不是您想要的。

当你分配一个数组时,你在内存中得到了一个地方,所以这个地方可以被另一个应用程序使用,所以如果不初始化那个地方,它会根据哪个应用程序使用那个地方给你意想不到的值。

试着这样理解它。所有的内存位置都被占用,当我们将一个特定的内存位置分配给一个变量时,它将转换该位置保存的原始值,也称为垃圾值,因此我们得到意想不到的值。

但是当你初始化一个变量或数组时,默认的垃圾值被指定的值所替换,我们得到想要的输出。