如何在不解除引用的情况下确定指向数据的大小?

时间:2016-03-05 11:58:24

标签: c typedef c99

简而言之

在标准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而不取消引用它?

2 个答案:

答案 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)