标题:一个宏引发的两个问题(求助)
取消只看楼主
tanzhou011
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2008-11-15
 问题点数:0 回复次数:2 
一个宏引发的两个问题(求助)
昨天在看别人的代码的时候,看到一个宏,大致的用法是根据结构体的成员地址可以获得结构体的地址,宏具体定义如下:
#define GET_HEAD(type, member, memberaddr) (type *)(void *)(memberaddr - (int) ((type *)0)->member),意思我大概看懂了,就是根据结构体成员跟结构体头的地址偏移量一定来得到结论。但是由此也引发了两个问题:
1.为何类型转换的时候要使用(void *),而不是直接转换成type?强制转换成void一般在何种场合下使用?
2.(type *)0->member的含义,既然是0地址,应该就代表NULL,一个指向NULL的结构体指针取成员,C语言应该是不允许的吧,但是如果把0看成起始地址为0的话,又说得过去。也就是说,在为指针分配内存的时候是不可能分配0这个地址的,那么一般是从哪个地址开始分配呢?
小弟比较迷惑,如有大侠解答,不胜感激
搜索更多相关主题的帖子: 结构体 member void 
2008-11-15 23:45
tanzhou011
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2008-11-15
得分:0 
怎么没人回啊。。。先顶一下
2008-11-16 10:14
tanzhou011
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2008-11-15
得分:0 
获益匪浅啊,还想问一下:6L的(((ptype)(void*)0)->field)),为什么不直接使用((ptype *)0)->field)?还有既然0地址无法使用,这样用会不会报错或者有危险?
2008-11-16 16:01



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-244518-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.363855 second(s), 8 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved