在标准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
在a内struct
,请参见单独的线程。
我目前正在使用的额外数据成员size_t
来跟踪sizeof (ElemType)
。有没有一种方法可以sizeof (ElemType)
从data
指针获取而不取消引用呢?
要获取类型的大小,可以将其应用于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
成员的目的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句