我正在使用定义为:
的宏容器_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;
}
我的设置有什么问题?
答案 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);