5

与えられたプログラム:

int main()
{

    short myVariableName1;  // stores from -32768 to +32767
    short int myVariableName2;  // stores from -32768 to +32767
    signed short myVariableName3;  // stores from -32768 to +32767
    signed short int myVariableName4;  // stores from -32768 to +32767
    unsigned short myVariableName5;  // stores from 0 to +65535
    unsigned short int myVariableName6;  // stores from 0 to +65535

    int myVariableName7;  // stores from -32768 to +32767
    signed int myVariableName8;  // stores from -32768 to +32767
    unsigned int myVariableName9;  // stores from 0 to +65535

    long     myVariableName10;  // stores from -2147483648 to +2147483647
    long     int myVariableName11;  // stores from -2147483648 to +2147483647
    signed   long myVariableName12;  // stores from -2147483648 to +2147483647
    signed   long int myVariableName13;  // stores from -2147483648 to +2147483647
    unsigned long myVariableName14;  // stores from 0 to +4294967295
    unsigned long int myVariableName15;  // stores from 0 to +4294967295
    cout << "Hello World!" << endl;
    cout << myVariableName1 << endl;
    cout << myVariableName2 << endl;
    cout << myVariableName3 << endl;
    cout << myVariableName4 << endl;
    cout << myVariableName5 << endl;
    cout << myVariableName6 << endl;
    cout << myVariableName7 << endl;
    cout << myVariableName8 << endl;
    cout << myVariableName9 << endl;
    cout << myVariableName10 << endl;
    cout << myVariableName11 << endl;
    cout << myVariableName12 << endl;
    cout << myVariableName13 << endl;
    cout << myVariableName14 << endl;
    cout << myVariableName15 << endl;
    cin.get();

    return 0;
}

割り当てられていない変数を印刷すると、以前にそのメモリ位置に保存されていたものがすべて印刷されます。私が気付いたのは、複数の連続した実行にわたって、出力された値が変更されていないことです。これは、実行するたびにメモリ内の場所が同じであることを示しています。

これがどのように決定されるのか、なぜそうなるのか、私はただ興味があります。

4

5 に答える 5

3

これらの変数はスタック上に存在します。プログラムの実行は決定論的であるように見えるため、実行するたびに同じことが起こります。必ずしも同じアドレスを選択するわけではありません (最近の多くのランタイムでは、実行間でスタック アドレスが同じにならないようにアドレス空間のランダム化手法を利用しています) が、スタック上の相対アドレスには毎回同じデータが含まれています。

于 2012-10-12T17:00:55.543 に答える
3

それらは、特定のものであることに依存しないで、何でもかまいません。
技術的には、値はIndeterminateです。

Indeterminate 値を使用すると、Undefined Behaviorになることに注意してください。

于 2012-10-12T17:00:55.997 に答える
3

それらはすべてスタックベースです。おそらく、スタートアップ コードは既にそれらの場所を使用しているので、残っているものは何でも取得しています。

于 2012-10-12T17:01:07.270 に答える
2

動作は「以前にそのメモリ位置に保存されたものは何でも」とは定義されていませんが、まったく定義されていません。何が起こるかについての保証はありません

私の推測では、お使いのオペレーティング システムは (最近のほとんどの OS がそうであるように) 仮想メモリを使用しているため、毎回同じメモリ アドレスを使用していると思われます。

于 2012-10-12T17:00:59.147 に答える
2

人間とは異なり、コンピューターは決定論的です。

通常、値が与えられていない変数を読み取るときに、コンパイラ オプションを使用して取得することをお勧めします。

したがって、OS はコードを取得し、常にまったく同じことを行います。したがって、同じ結果です。

しかし、コードをいじり始めると、実行可能ファイルが異なります。具体的でなかったので、次回は別の結果が得られます。

したがって、要約すると、コンパイラのすべての機能を使用して、このエラーを見つけ、その変数を使用する前に変数値を与える習慣を身に付けることができます。

于 2012-10-12T17:04:45.670 に答える