Linux内核链表实现的list_entry()中的(char *)强制转换

时间:2011-12-22 19:01:56

标签: c

这是宏定义:

/**
 * list_entry - get the struct for this entry
 * @ptr:    the &struct list_head pointer.
 * @type:   the type of the struct this is embedded in.
 * @member: the name of the list_struct within the struct.
 */
#define list_entry(ptr, type, member) \
    ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))

我不明白为什么ptr被转换为(char *)。我不能只从member中减去ptr的偏移量吗?像这样:

#define list_entry(ptr, type, member) \
        ((type *)((ptr)-(unsigned long)(&((type *)0)->member)))

谢谢!

1 个答案:

答案 0 :(得分:5)

没有。指针算术等同于:

ptr[addend]

不是

(ptr_type *)((unsigned long)&ptr + addend)

后者需要显式转换为char *(因为这是内存的单位)才能直接操作指针的值。