打印

程序问题

[复制链接]
984|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
txcy|  楼主 | 2013-11-29 14:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <iostream>
using namespace std;

class A
{
public:
void Func(void){ cout << "Func of class A" << endl; }

};

A* Test(void)
{
A *p;
A a;
p = &a; // 注意 a 的生命期
return p;
}

void main()
{
// 这段程序搞笑了
A *q;
        /*q = Test();*/
        q = NULL;
q->Func();
system("pause");
}

代码如上,输出结果为“Func of class A”,可是我明明将q变为空指针了。
如果去掉代码“q = NULL;”,编译出错。
如果取消注释/*q = Test();*/,不论是否注释“q = NULL;”,结果还是输出“Func of class A”,可是栈里面的a对象明明已经被自动销毁了,这个时候返回的q应该是野指针才对吧?

这一切的一切,是为啥呢?难道C++和C的底层原理不同?

相关帖子

沙发
无冕之王| | 2013-11-29 14:30 | 只看该作者
未定义行为,能输出完全是靠运气,你在A *q;后面再定义几个其他变量,估计会导致出错了,这个看编译器的

使用特权

评论回复
板凳
无冕之王| | 2013-11-29 14:31 | 只看该作者
未定义行为,能输出完全是靠运气,你在A *q;后面再定义几个其他变量,估计会导致出错了,这个看编译器的

使用特权

评论回复
地板
yybj| | 2013-11-29 14:39 | 只看该作者
不是未定义行为,Func()里没有用到非静态的成员变量,也就是跟本不需要用到this指针,所以你完全可以这样调用((A*)0)->Func()

使用特权

评论回复
5
dfsa| | 2013-11-30 08:26 | 只看该作者
yybj 发表于 2013-11-29 14:39
不是未定义行为,Func()里没有用到非静态的成员变量,也就是跟本不需要用到this指针,所以你完全可以这样调 ...

可以试试

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

274

主题

2106

帖子

0

粉丝