仅在给定成员的位置时结构的位置

时间:2014-05-20 23:25:06

标签: c memory-management struct

让我们假设有一个包含多个成员的结构。 struct成员使用一些值进行初始化。给出了特定成员的内存位置。假设你不了解其他成员,他们的类型,成员的顺序等。有没有办法知道结构本身的内存位置?

此问题是否称为特定名称?

3 个答案:

答案 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()的编写方式