首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么在C++中使用Unix和Windows系统声明指针时会出现这种行为?

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

Stack Overflow用户
提问于 2014-04-03 01:03:30
回答 1查看 112关注 0票数 0

我没有在Stack溢出或Google中找到这个问题,所以如果它是重复的,我很抱歉。

如我所知,C/C++中的变量没有初始化。但最近,当我使用指针时,出现了一种奇怪的情况。见下面的代码:

代码语言:javascript
运行
复制
#include <iostream>

using namespace std;

struct Test {
    int i;
};

struct Box{
    Test *var;
};

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

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

代码语言:javascript
运行
复制
0x3e0178

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

代码语言:javascript
运行
复制
0x0

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

同样,对于公共变量,也会发生同样的情况。对于下面的代码,结果是Unix系统中的0和Windows中的4385838

代码语言:javascript
运行
复制
int main() {
    int i;
    cout << i << endl;
}

更新

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

代码语言:javascript
运行
复制
int main() {
    int *p;
    cout << p;
}

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-03 01:27:27

在所有现代(多用户)操作系统中,直接从操作系统接收到的内存被归零,以避免信息泄漏。所发生的事情可能是Unix系统,因为必须运行更少的启动代码才能设置适当的C运行时环境,main()很幸运地获得了原始内存,而不是重用以前用于不同函数的堆栈空间来存储i。另一种可能的解释是,以前有人刚刚在那里存储了0。

不管怎么说,看在上帝的份上别指望它了。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22825951

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档