我没有在 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
时,编译器是否以递归方式初始化指针?
此外,对于公共(public)变量也会发生同样的情况。对于下面的代码,结果在 Unix 系统中为 0
,在 Windows 中为 4385838
:
int main() {
int i;
cout << i << endl;
}
更新
在另一个测试中,这次两个系统的行为是相同的:指针 p
指向内存中的一个随机地址。
int main() {
int *p;
cout << p;
}
只是为了解释我的问题:我知道我们必须在使用变量之前对其进行初始化,但是一个学生问我为什么他的程序在 Unix 系统中运行良好而不是在 Windows 系统中。我在他的程序中发现了这个指针问题,想反馈一下。
最佳答案
在所有现代(多用户)操作系统中,直接从操作系统接收的内存都被清零,以避免信息泄漏。发生了什么,可能是 Unix 系统,因为必须运行的启动代码要少得多才能设置适当的 C 运行时环境,main()
很幸运得到了原始内存,没有重用以前用于的堆栈空间一个不同的功能,存储我。另一种可能的解释是,之前有人在那里存储了一个 0。
无论如何,看在老天的份上不要依赖它。
关于c++ - 为什么在使用 Unix 和 Windows 系统的 C++ 中声明指针时会出现这种行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22825951/