在标准C中,如何从指针确定指向数据的大小但不解除引用?
我希望在标准C ++ 98库中实现容器的C99模仿,如下所示:
#define vector(ElemType) \
struct { \
ElemType *data; \
size_t count; \
size_t capacity; \
// typedef ElemType eltype; \ // not permitted in C!
}
/* ... */
vector(double) dv;
vector_create(&dv, 10);
vector_pushback(&dv, 35.4);
vector_destroy(&dv);
主要问题是C不允许typedef
内有struct
,请参阅separate thread。
我目前正在使用size_t
的额外数据成员来跟踪sizeof (ElemType)
。有没有办法从sizeof (ElemType)
指针获取data
而不取消引用它?
答案 0 :(得分:4)
要获取类型的大小,您可以将sizeof
应用于数据本身:
sizeof(*dv.data)
或者简单地说:
sizeof *dv.data
但我发现括号内的版本更具可读性。
指针dv.data
可以是NULL
,它没有被解除引用,对于这个简单的例子,sizeof
在编译时被评估。
C11 6.5.3.4
sizeof运算符产生其操作数的大小(以字节为单位),该操作数可以是表达式或类型的带括号的名称。大小由操作数的类型确定。结果是整数。如果操作数的类型是可变长度数组类型,则计算操作数;否则,不评估操作数,结果是整数常量。
事实上,建议将对象大小传递给malloc
:
ElemType *p = malloc(sizeof(*p) * capacity);
使用sizeof(*p)
代替sizeof(ElemType)
可防止在以后更改p
类型时未检测到的大小不匹配。
没有办法让数组dv.data
的元素数量指向,而不单独维护计数,这是capacity
成员的目的。
答案 1 :(得分:1)
在C99中,可以使用sizeof(*dv.data)
。