这样也可以!

john 2014-04-10 11:36:05
读别人的代码,发现了这个现象。竟然能这样!正常执行无误。野指针不野。 环境是VS2012下(据说VC6也可以)
#include "stdafx.h"
#include <process.h>

class test
{
public:
int b;
void fun() ;
};

void test::fun()
{
int a = 99;
//b = 1; //运行时出错。
printf("This is a Test! \n\r");
}

class test* p = 0;

int _tmain(int argc, _TCHAR* argv[])
{
p->fun();
((class test*)(NULL))->fun();
((class test*)(67))->fun();
system("pause");
return 0;
}
...全文
159 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
gergul 2014-04-10
  • 打赏
  • 举报
回复
p->fun();相当于:test::fun(0){...}这样的调用,当没有使用到参数0,既没有使用到(0)->b = 1;的话,是完全没有影响的,当然,如果使用到(0)->b = 1;那就可定错了。 ((class test*)(NULL))->fun();相当于:test::fun(NULL){...}这样的调用,当没有使用到参数0,既没有使用到(NULL)->b = 1;的话,是完全没有影响的,当然,如果使用到(NULL)->b = 1;那就可定错了。 ((class test*)(67))->fun();相当于:test::fun(67){...}这样的调用,当没有使用到参数0,既没有使用到(67)->b = 1;的话,是完全没有影响的,当然,如果使用到(67)->b = 1;那就可定错了。
loong0306 2014-04-10
  • 打赏
  • 举报
回复
....表示只能看懂 system...
ztenv 版主 2014-04-10
  • 打赏
  • 举报
回复
调用的函数没有访问类对象的数据成员,是不会有问题的,如果访问了就有问题,因为访问时找不到数据成员的地址,而函数成员的地止是可以找到的。
john 2014-04-10
  • 打赏
  • 举报
回复
学习了。学习了。谢谢指教。
赵4老师 2014-04-10
  • 打赏
  • 举报
回复
其实电脑开机后物理内存的每个字节都是可读写的,区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页,一页通常为4KB。
baichi4141 2014-04-10
  • 打赏
  • 举报
回复
没错,可以 非静态成员函数只比静态成员函数多一个隐藏的this指针,只要你不修改这个指针指向的内存(即操作该对象的成员变量),这个对象就根本不需要实际存在
「已注销」 2014-04-10
  • 打赏
  • 举报
回复
赞同1,2楼!对于member function的调用实际被转换为non-member function函数加上this指针为参数。你使用b=1;时会发生错误,这个时候就说明这个指针有问题!
yangchuankai 2014-04-10
  • 打赏
  • 举报
回复
iamnobody 2014-04-10
  • 打赏
  • 举报
回复
如果你认为能够执行就是正确的,那你就错了.

64,639

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧