我想实现一个通用的增长数组并使用这个结构:
struct dynamic_array
{
void** data;
size_t length;
size_t capacity;
};
由于void*
不允许算术,我想知道void*
数组是否允许它,因为它是{em>指针到{{1} }。如果这不起作用,我想知道如何实现通用数组。
编辑:由于不是每个人都知道我想用它做什么,这里是一个代码片段,我可以如何使用该数组:
void*
当然它不仅仅是char *而且是struct *,而且我知道我必须强制转换它们,但是void *应该允许来回转换而不丢失数据,对吗?
答案 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 **
确实如此,因为我们确切地知道它指向的是什么:指针。