如何从结构体成员的地址获取结构体的起始地址

7
在C语言中,如何从结构体成员的地址获取结构体的起始地址?
struct type1 {
    //...
    int member1;
    //...
};
struct type1 obj1;

如果ptr1obj1中成员member1的地址,如何定义宏#define start_add(ptr1, type1, member1)以获取obj1的起始地址?

2个回答

14

你可以使用offsetof来实现这个功能:

#define start_add(ptr1, type1, member1) ((type1 *)((char *)(ptr1) - offsetof(type1, member1)))

2
我认为在(ptr1)之前多了一个&ptr1已经是成员的地址了。 - CB Bailey
你还应该在整个宏结果周围添加额外的一组括号 - 记住 -> 的优先级高于 (type),因此如果你想将 -> 应用于结果,你需要它们。 - caf
@caf:这也是一个很好的观点,因为 -> 经常是接下来要输入的内容。 - Greg Hewgill

1

这是来自Windows WDK的内容

/* 
 #define CONTAINING_RECORD(address, type, field) ((type *)( \
      (PCHAR)(address) - \
      (ULONG_PTR)(&((type *)0)->field)))
*/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接