除非所有字段都初始化为0,否则int数组会给出疯狂的值,为什么?

时间:2013-03-16 14:23:28

标签: c++ arrays initialization

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 << "\n\nHow 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:1317 3:2724 4:4145 5:5513 6:7056 7:8343 8:6982 9:5580 10:4176 11:2776 12:1388

哪个好。

但是,我想知道的是,为什么我必须将数组设置为{0,0,0,0,0,0,0,0,0,0,0,0,0}? / p>

如果我不这样做;我明白了:

2:30626868 3:1638233 4:844545295 5:1 6:9 7:4202510 8:4199197 9:844555757 10:3 11:4202574 12:2130567168

4 个答案:

答案 0 :(得分:4)

如果你没有初始化数组,然后继续增加它的元素,从技术上来说这是undefined behaviour

在实践中发生的事情是,当main()启动时,数组的元素会获得堆栈上的任何值。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

尝试以这种方式理解它。所有内存位置都是收费的,当我们为变量分配特定的内存位置时,它将转换该位置所持有的原始值,也称为垃圾值,因此我们得到意外的值。 / p>

但是,当您初始化变量或数组时,默认的垃圾值将替换为指定的值,我们将获得所需的输出。

希望这有帮助。