让我们假设有一个包含多个成员的结构。 struct成员使用一些值进行初始化。给出了特定成员的内存位置。假设你不了解其他成员,他们的类型,成员的顺序等。有没有办法知道结构本身的内存位置?
此问题是否称为特定名称?
答案 0 :(得分:4)
如果您知道结构的名称,只需使用offsetof
struct my_struct {
const char *name;
struct list_node list;
};
int main() {
struct my_struct t;
struct list_node* pl = &t.list;
size_t offset = offsetof(struct my_struct, list); //here
struct my_struct* pt = (struct my_struct*)((unsigned char*)pl-offset); //and here
}
如果offsetof
对你正在做的事情不可行,那么不,别无他法。 Offsetof也可以用标准C编写,但绝对没有充分理由这样做。
答案 1 :(得分:2)
如果你知道结构类型,那么你需要的只是结构中字段的偏移量,从成员地址中减去它,并将类型转换结果减去指向结构的指针。有关实际实施,请参阅FreeBSD's implementation of __containerof()。
答案 2 :(得分:0)
大家好我找到了答案
转换结构的空指针。您可以通过将结果地址(偏移量)转换为char *
来获取偏移量(char *)(&((struct *)0)->member))
你可以做任何类型的*。但char *保证它始终是字大小。
这应该是offsetof()的编写方式