一个宏引发的两个问题(求助)
昨天在看别人的代码的时候,看到一个宏,大致的用法是根据结构体的成员地址可以获得结构体的地址,宏具体定义如下:#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这个地址的,那么一般是从哪个地址开始分配呢?
小弟比较迷惑,如有大侠解答,不胜感激