求解惑:((Point3D*)0)->Display();

DontKissBossAss 2011-02-13 03:30:35
多次看到这中语法了。
其中一次是offsetof用法
#define offsetof(s,m)   (size_t)&reinterpret_cast<const volatile char&>((((s *)0)->m))


然后一次就是在读C++对象模型时,static函数的前身调用都是如下调用
Point3D 是一个类,Display 是Point3D的一个成员函数,对Display的调用能下如下格式:

((Point3D*)0)->Display();



但是我了解,windows系统,0-64K地地方是特殊空间,用来消除野指针等操作(这只是一个例子)
对这个空间的写操作会造成异常。

那么 上述代码这种,把NULL(0)强转成类型的做法是什么意思呢。?在线求解。
...全文
111 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
昵称很不好取 2011-02-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 dontkissbossass 的回复:]
引用 3 楼 thefirstz 的回复:
看看这篇文章:http://www.cppblog.com/aaxron/archive/2010/10/26/131317.html


麻烦问下,你这文章说的动态连编是指virtual 多态这些东西么?就是编译时期不知道调用哪一个,这样的函数。
[/Quote]
动态连编对应多态
DontKissBossAss 2011-02-13
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 thefirstz 的回复:]
引用 6 楼 dontkissbossass 的回复:
引用 2 楼 thefirstz 的回复:
NULL指针不能读取,但这里并没有读取这个指针所指内存,只是调用了相应的成员函数
((Point3D*)0)->Display();这个只是调用了Display成员函数,而且这个函数不需要传递this指针内存块中的数据
offset也是一样的道理,只是返回一个结构中某个成员的偏移量,并不会产……
[/Quote]

谢谢。
昵称很不好取 2011-02-13
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 dontkissbossass 的回复:]
引用 2 楼 thefirstz 的回复:
NULL指针不能读取,但这里并没有读取这个指针所指内存,只是调用了相应的成员函数
((Point3D*)0)->Display();这个只是调用了Display成员函数,而且这个函数不需要传递this指针内存块中的数据
offset也是一样的道理,只是返回一个结构中某个成员的偏移量,并不会产生读NULL指针的操作


看了你这文章,我对off……
[/Quote]
对了
DontKissBossAss 2011-02-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 thefirstz 的回复:]
NULL指针不能读取,但这里并没有读取这个指针所指内存,只是调用了相应的成员函数
((Point3D*)0)->Display();这个只是调用了Display成员函数,而且这个函数不需要传递this指针内存块中的数据
offset也是一样的道理,只是返回一个结构中某个成员的偏移量,并不会产生读NULL指针的操作
[/Quote]

看了你这文章,我对offsetof的理解如下,请指点

在offsetof中,编译器也是只需要知道s的类型,然后呢,因为编译器已经知道结构体的内存布局,当你把起始地址指向0以后,&s->m 自然返回的就是m相对于0的地址,这其中没有涉及到0的读写操作。

靠了,编译器还藏着么多东西呢?
DontKissBossAss 2011-02-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 thefirstz 的回复:]
看看这篇文章:http://www.cppblog.com/aaxron/archive/2010/10/26/131317.html
[/Quote]

麻烦问下,你这文章说的动态连编是指virtual 多态这些东西么?就是编译时期不知道调用哪一个,这样的函数。
昵称很不好取 2011-02-13
  • 打赏
  • 举报
回复
offsetof宏体(size_t)后面有个&,表示取这个成员的地址,而整个结构的地址是0,取该成员的地址得到的成员的想对该结构的偏移量
昵称很不好取 2011-02-13
  • 打赏
  • 举报
回复
昵称很不好取 2011-02-13
  • 打赏
  • 举报
回复
NULL指针不能读取,但这里并没有读取这个指针所指内存,只是调用了相应的成员函数
((Point3D*)0)->Display();这个只是调用了Display成员函数,而且这个函数不需要传递this指针内存块中的数据
offset也是一样的道理,只是返回一个结构中某个成员的偏移量,并不会产生读NULL指针的操作
zhangsongcui 2011-02-13
  • 打赏
  • 举报
回复
据说是手机神马东西上面,调用系统内核程序的东西
不了解帮顶

65,187

社区成员

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

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