帮忙解释一((s *)0)->m为什么不会崩溃。。

sward2005 2011-01-19 05:17:32
#define offsetof(s,m) (size_t)&reinterpret_cast<const volatile char&>((((s *)0)->m))

代码如上,解释有分。。
...全文
212 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq120848369 2011-01-19
  • 打赏
  • 举报
回复
就是算算结构体S里m变量与结构体首地址的偏移量,因为内存0作为首地址,所以只要取变量m的内存地址就是偏移量的大小了.

这里没有写内存,只是你想以S类型解释0地址开始的内存,就像:

int *p=(int*)malloc(sizeof(int)*4);

你只不过强制把内存当做int类型的,其实它不过就是一段内存而已,只不过是void而已.
机智的呆呆 2011-01-19
  • 打赏
  • 举报
回复
QJ是犯罪但YY不是~~~~lz懂得啊
qwqwqw408 2011-01-19
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 bluesky12312388 的回复:]
引用楼主 sward2005 的回复:
#define offsetof(s,m) (size_t)&amp;reinterpret_cast<const volatile char&amp;>((((s *)0)->m))

代码如上,解释有分。。

LS各位都没说到点子上,这不是一般的指针,
如果我猜得没错的话应该是求成员变量在类对象中的偏移,
这个 (s *)0……
[/Quote]

1,这个宏无论是名字,还是其定义,都深深的出卖了它的作用,所以不需要猜。。
2,明明楼上有几位说的是正确的,至少4楼的说到点子上了,他解释了为什么不会崩溃,你偏要说没说到点子上,人家楼主问的并不是这个宏的作用。。
3,其实这就是个一般的指针,并非一定要是类的,结构体也行。
iambic 2011-01-19
  • 打赏
  • 举报
回复
C++标准好像没规定过程序要崩溃吧,任何情况下。
pengzhixi 2011-01-19
  • 打赏
  • 举报
回复
诶 在想知道类成员的偏移量的时候就是这么使用的。
xy_zhang 2011-01-19
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 bluesky12312388 的回复:]

引用楼主 sward2005 的回复:
#define offsetof(s,m) (size_t)&amp;reinterpret_cast<const volatile char&amp;>((((s *)0)->m))

代码如上,解释有分。。

LS各位都没说到点子上,这不是一般的指针,
如果我猜得没错的话应该是求成员变量在类对象中的偏移,
这个 (s ……
[/Quote]

从宏定义的名字不就看出来了么……如果我猜的没错的话……
bluesky12312388 2011-01-19
  • 打赏
  • 举报
回复
[Quote=引用楼主 sward2005 的回复:]
#define offsetof(s,m) (size_t)&reinterpret_cast<const volatile char&>((((s *)0)->m))

代码如上,解释有分。。
[/Quote]
LS各位都没说到点子上,这不是一般的指针,
如果我猜得没错的话应该是求成员变量在类对象中的偏移,
这个 (s *)0 代表类对象开始。并不是指向地址为0的指针。
MYMGrub 2011-01-19
  • 打赏
  • 举报
回复
只是一个预处理的操作,定义了一个名字,又没有“叫”它,为什么会有问题呢?去掉“&”只写个定义在这应该也没有问题的..
zy020118 2011-01-19
  • 打赏
  • 举报
回复
"&"前面这个取址号的原因,这里只关心了地址,并没有对内存做任何操作。。
xy_zhang 2011-01-19
  • 打赏
  • 举报
回复
#define offsetof(s,m) (size_t)&reinterpret_cast<const volatile char&>((((s *)0)->m))
#define offsetof(s,m) (size_t)&(((s *)0)->m)

只是取了地址,没有解引用,不会崩溃。
ayw215 2011-01-19
  • 打赏
  • 举报
回复
没有写 只有读
bdmh 2011-01-19
  • 打赏
  • 举报
回复
为啥要崩溃,你没有对任何变量进行读写啊
  • 打赏
  • 举报
回复
没有读写m所以不会崩溃。

64,648

社区成员

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

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