使用Unix和Windows系统在C ++中声明指针时为什么会出现这种情况?

时间:2014-04-03 01:03:31

标签: c++ windows pointers unix

我没有在Stack Overflow或Google中找到这个问题,很遗憾,如果它是重复的话。

据我所知,C / C ++中的变量未初始化。但是最近使用指针时我发生了一种奇怪的情况。请参阅以下代码:

#include <iostream>

using namespace std;

struct Test {
    int i;
};

struct Box{
    Test *var;
};

int main() {
    Box *t = new Box;
    cout << t->var;
}

在Windows中,我得到的输出类似于(预期的):

0x3e0178

但是,在Unix系统中,输出是:

0x0

为什么会这样?在Unix系统中调用new时,编译器是否以递归方式初始化指针?

此外,使用常见变量也会发生同样的情况。对于下面的代码,结果在Unix系统中为0,在Windows中为4385838

int main() {
    int i;
    cout << i << endl;
}

更新

在另一个测试中,这次的行为在两个系统中是相同的:指针p指向内存中的随机地址。

int main() {
    int *p;
    cout << p;
}

只是为了解释我的问题:我知道我们必须在使用它之前初始化变量,但是一个学生问我为什么他的程序在Unix系统而不是在Windows中工作正常。我在他的程序中发现了这个指针问题,我想给出反馈。

1 个答案:

答案 0 :(得分:2)

在所有现代(多用户)操作系统中,直接从os接收的内存被归零,以避免信息泄露。会发生什么,可能是Unix系统,因为必须运行少得多的启动代码才能建立一个合适的C运行时环境,main()通过愚蠢的运气得到处女内存,而不是重用以前用于不同功能的堆栈空间,商店我另一种可能的解释是,有人之前只存储过0。

无论如何,为了天堂,不要依赖它。