如何确定未初始化变量的值?

时间:2012-10-12 16:57:25

标签: c++ initialization

给出一个程序:

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;
}

打印出未分配的变量将打印先前存储在该内存位置的内容。我注意到,在多次连续执行中,打印值没有变化 - 这告诉我每次执行时内存中的位置都是相同的。

我只是好奇这是如何确定的,为什么会这样。

5 个答案:

答案 0 :(得分:3)

这些变量存在于堆栈中。程序的执行看起来是确定性的,因此每次运行它时都会发生同样的事情。它不是必须选择相同的地址(现在很多运行时使用地址空间随机化技术来确保堆栈地址在运行之间相同),但堆栈上的相对地址包含相同的地址每次数据。

答案 1 :(得分:3)

他们可以是任何不依赖于他们的东西 从技术上讲,值 Indeterminate

请注意,使用Indeterminate值会导致未定义的行为

答案 2 :(得分:3)

他们都是基于堆栈的。可能启动代码已经使用了这些位置,所以你得到它们留下的任何东西。

答案 3 :(得分:2)

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

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

答案 4 :(得分:2)

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

在读取未赋值的变量时,通常最好使用编译器选项来获取。

因此操作系统会选择代码,并始终做同样的事情。因此结果相同。

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

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