| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1131 人关注过本帖
标题:一个宏引发的两个问题(求助)
取消只看楼主 加入收藏
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
快速回复:一个宏引发的两个问题(求助)
数据加载中...
 
   



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

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