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

标签 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 时,编译器是否以递归方式初始化指针?

此外,对于公共(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/

相关文章:

windows - 通过 PsExec 在远程计算机中执行批处理文件

c++ - 0x742808F2 处未处理的异常:Microsoft C++ 异常:内存位置 0x0055E9E4 处的 std::out_of_range

c++ - 我如何将 uint32_t 转换为 char* 类型

c# - 将具有 C++ 引用成员的 C# 类编码

c++ - 哪些标识符可用于构造函数初始化列表中的 lambda

python - pipenv shell在虚拟环境中启动子shell… 'powershell.exe'无法识别为内部或外部命令,可操作程序或

c++ - FFMPEG 设置网络摄像头编码器 C++

c++ - 在 C++ 中定义指向列表的指针

c++ - 试图删除作为指针的模板类型的编译器错误

c++ - 天空盒错误c++