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

该行为未定义为“之前存储在该内存位置的任何内容”,但它根本没有定义。无法保证会发生什么

我最好的猜测是您的操作系统正在使用虚拟内存(就像大多数现代操作系统一样),因此每次都为您提供相同的内存地址。

于 2012-10-12T17:00:59.147 回答
2

与人类不同,计算机是确定性的。

通常在读取尚未赋值的变量时使用编译器选项是一个好主意。

因此,操作系统会提取代码并每次都执行完全相同的操作。因此结果相同。

但是,如果您开始摆弄代码,则可执行文件会有所不同。由于您没有具体说明,因此下次您会得到不同的结果。

因此,总而言之,只需使用编译器的所有功能来帮助您发现此错误并养成在使用该变量之前给变量值的习惯。

于 2012-10-12T17:04:45.670 回答