我没有在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中工作正常。我在他的程序中发现了这个指针问题,我想给出反馈。
答案 0 :(得分:2)
在所有现代(多用户)操作系统中,直接从os接收的内存被归零,以避免信息泄露。会发生什么,可能是Unix系统,因为必须运行少得多的启动代码才能建立一个合适的C运行时环境,main()
通过愚蠢的运气得到处女内存,而不是重用以前用于不同功能的堆栈空间,商店我另一种可能的解释是,有人之前只存储过0。
无论如何,为了天堂,不要依赖它。