1
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} に設定しなければならなかったのかということです。

そうしないと。私は得る:

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

4

4 に答える 4

4

配列を初期化せずにその要素をインクリメントする場合、技術的にはこれは未定義の動作です。

実際には、配列の要素は、開始時にたまたまスタックにある値を取得しmain()ます。

于 2013-03-16T14:26:03.400 に答える
2

ローカル変数は関数のスタックに置かれます。この領域は、コンパイラまたはオペレーティング システムによって初期化されません。これは、関数が呼び出されたときにローカル変数の値がメモリ内にあるものとまったく同じであることを意味します。

于 2013-03-16T14:27:33.653 に答える
1

配列を割り当てると、メモリ内に場所ができたので、この場所は別のアプリケーションで以前に使用できたので、その場所を初期化しないと、その場所を使用していたアプリケーションに応じて予期しない値が得られます。

于 2013-03-16T14:30:24.013 に答える
1

このように理解してみてください。すべてのメモリ位置が課金され、特定のメモリ位置を変数に割り当てると、その位置が保持していた生の値 (ガベージ値とも呼ばれます) が変換されるため、予期しない値が取得されます。

しかし、変数または配列を初期化すると、デフォルトのガベージ値が指定された値に置き換えられ、目的の出力が得られます。

お役に立てれば。

于 2013-03-16T14:32:53.163 に答える