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

日志

简而言之

在标准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指针获取而不取消引用呢?

chqrlie

要获取类型的大小,可以将其应用于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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

此Go代码如何在不取消引用的情况下通过指针设置对象的值?

如何在不取消引用指针的情况下返回指针的指针值?

Perl:如何在不创建数组副本的情况下取消引用数组?

如何在不排序的情况下取消堆叠?

如何在不运行容器的情况下确定 UID?

如何在不直接引用数组名称的情况下从json数组获取数据

如何在不丢失数据的情况下安装Ubuntu?

如何在不轮询的情况下获取数据?

如何在不覆盖的情况下加载数据?

如何在不刷新数据的情况下打开Excel

如何在不丢失数据的情况下“关闭” juju?

如何在不破坏画布的情况下刷新数据

如何在不丢失数据的情况下安装 ubuntu

如何在不指定大小的情况下创建ShareFileClient以便能够向其流式传输数据?

如何在不增加数据大小的情况下将熊猫中的分类变量转换为数值?

如何在不指向 Java 源列表中的对象的情况下复制 ArrayList?

我的 Python 如何在不设置 PATH 的情况下指向 Python3?

Angular 6-如何在不执行服务功能的情况下将其指向JSON对象

如何在不进行强制转换的情况下取消引用void变量

如何在不知道大小的情况下取消分配不规则的***矩阵?

python - 如何在不更改前景大小的情况下增加背景大小?

如何在不取消选择注释的情况下更新标注视图?

如何在不丢失这些类型的情况下取消列出混合类型列表?

如何在不更改 Git 的情况下取消暂存文件?

如何在不终止执行此操作的线程的情况下取消文件上载/下载操作?

如何在不取消API调用的情况下使用axios设置超时?

如何在R中不包含前缀的情况下取消列出嵌套命名列表?

如何在不破坏链接的情况下取消链接到自身的文件

如何在不取消新调用的情况下锁定存储过程