void ** portable C?

时间:2017-11-29 19:59:13

标签: c arrays pointers generics

我想实现一个通用的增长数组并使用这个结构:

struct dynamic_array
{
    void** data;
    size_t length;
    size_t capacity;
};

由于void*不允许算术,我想知道void*数组是否允许它,因为它是{em>指针到{{1} }。如果这不起作用,我想知道如何实现通用数组。

编辑:由于不是每个人都知道我想用它做什么,这里是一个代码片段,我可以如何使用该数组:

void*

当然它不仅仅是char *而且是struct *,而且我知道我必须强制转换它们,但是void *应该允许来回转换而不丢失数据,对吗?

1 个答案:

答案 0 :(得分:2)

是的,这很有效。指向void(void *)的指针是一个完全有效的数据对象,因此您可以拥有一个指向void的指针数组,并以正常方式访问该数组中的元素。

示例代码段:

int i;
char c;
float f;

struct dynamic_array a;
a.capacity = 1024;
a.data = malloc(a.capacity * sizeof(void*));
a.data[0] = &i;
a.data[1] = &c;
a.data[2] = &f;
a.length = 3;

正如Lee Daniel Crocker所写,void *不允许指针算术,因为编译器不知道它指向的是什么。但是void **确实如此,因为我们确切地知道它指向的是什么:指针。