如何检索包含container_of宏指针的结构

时间:2018-03-05 19:01:02

标签: c pointers void-pointers

我正在使用定义为:

的宏容器_of
#define container_of(ptr, type, member) ((type *)((char *)(1 ? (ptr) : &((type *)0)->member) - offsetof(type, member)))

结构向量:

struct vector {
    uint32_t signature;
    size_t element_size;
    size_t size;
    void *data;
};

最后,函数vectorSize接收指向某些数据的指针。此功能无效,因为只有 struct vector v 中的数据成员具有正确的值,其他成员具有垃圾,导致if语句SIGNATURE失败。

size_t vectorSize(void *vec)
{
    void **pdata = &vec;
    struct vector *v = container_of(pdata, struct vector, data);

    if (v->signature != VECTOR_SIGNATURE) return 0;
    return v->size;
}

我的设置有什么问题?

3 个答案:

答案 0 :(得分:0)

首先,请不要发布像PS c:\users\username> tsc -v Version 2.7.2 这样的代码。我知道,这是您在挖掘问题时的实验代码。但它不应该贴在这里,因为它让我们感到困惑。

如果我理解你正确,你的函数会收到一个指向struct成员的指针,你需要一个宏来传递容器结构。试试这个:

1 ? this : that

其次是:

#define CONTAINER_OF(MemberPtr, StrucType, MemberName) ((StrucType*)( (char*)(MemberPtr) - offsetof(StrucType, MemberName)))

答案 1 :(得分:0)

container_of宏的示例用法:

struct vector *vector_of(void* element) 
{
    return container_of(element, struct vector, data);
}

对于您的实施,在我看来它应该是这样的:

size_t vector_size(void *vec_ptr)
{
    struct vector *vec = v_ptr;
    return vec->signature != VECTOR_SIGNATURE ? 0 : vec->size;
}

答案 2 :(得分:0)

由于数据的类型为(void *),因此vec必须为(void **)。 但您不应提供vec的地址。 而是将其强制转换为(void **)。如下所示:

struct vector *v = container_of((void **)vec, struct vector, data);