【发布时间】:2018-03-05 19:01:02
【问题描述】:
我使用的宏container_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 中的 data 成员具有正确的值,其他成员有垃圾,导致 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;
}
我的设置有什么问题?
【问题讨论】:
-
我不明白。如果指针的容器没有正确初始化,为什么要怪宏呢?
-
@EugeneSh。容器已正确初始化。但是当我用 container_of 检索它时,只有数据指针设置正确
-
因为
vec参数不是vector结构的成员。它可能是这样一个成员的副本,但这无济于事。 -
@interjay 好点。很难发现...
pdata必须是成员的实际地址。目前它是vec参数的地址。您可能希望更改函数的签名以获取实际地址。 -
我不明白你的宏,你为什么要做
1 ? (ptr) : ...在条件为真时使用?:运算符有什么意义?
标签: c pointers void-pointers