gpt4 book ai didi

将 void 指针转换为任意类型指针

转载 作者:行者123 更新时间:2023-11-30 14:26:28 47 4
gpt4 key购买 nike

为了我自己的学习利益,我正在尝试用 C 语言自己实现常见数据结构。我当前的工作是一个 vector ,我希望它能够保存单个任意类型(或者至少是类型大小,但这在 C 中不是真正重要的吗?)。我的结构如下:

struct vector
{
void *item;
size_t element_size;
size_t num_elements;
}

但是,我不明白的是,如果类型应该是任意的,我如何引用 *item 数组中的特定元素。我知道 element_size,但这对我进行索引引用(例如 item[5])没有帮助,因为 void 不是类型。我认为将元素称为字节偏移量是最简单的。因此,如果我持有大小为 12 的结构体 vector ,则 item[5] 将位于距离 item* 12*5=60 字节的位置。但是,我不明白如何检索该数据。我知道我想要 item+60 中的 12 个字节,但是如何让编译器理解这一点?我是否进入了预处理器领域?

最佳答案

sizeof 是以字符为单位的,所以你可以这样做:

void *start_of_sixth_element = ((char*)item) + (5 * element_size);

知道每个元素类型的人可以将 start_of_sixth_element 转换为正确的类型来使用它。

void* 在某种程度上是一个糟糕的选择,因为你不能使用标准 C 中的 void* 指针进行指针算术(有一个 GNU 扩展允许它,但对于可移植代码,至少在算术中使用 char*unsigned char* )。

在应用偏移量 5 之前知道正确类型的代码可以执行以下操作:

correct_type *sixth_element = ((correct_type *)item) + 5;

void 不是类型

它是一种类型,只是不是“完整类型”。 “不完整类型”几乎意味着编译器不知道 void* 真正指向什么。

关于将 void 指针转换为任意类型指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9065777/

47 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com