C 如何在运行时将任何类型存储在void*中?
我正在用C编写一个动态数组:C 如何在运行时将任何类型存储在void*中?,c,byte,dynamic-arrays,C,Byte,Dynamic Arrays,我正在用C编写一个动态数组: struct array { int len; int cap; void *data; }; 如果我知道值的类型,就很容易存储值: void set(array* a, int idx, int val) { ((int*)a->data)[idx] = val; } 但我想接受任何类型(void*): 这显然无法编译,因为'void'是不可赋值的 据我所知,编译器需要有关类型的信息来获取其大小并计算访问数据的偏移量 有没有办法让我自
struct array {
int len;
int cap;
void *data;
};
如果我知道值的类型,就很容易存储值:
void set(array* a, int idx, int val) {
((int*)a->data)[idx] = val;
}
但我想接受任何类型(void*):
这显然无法编译,因为'void'是不可赋值的
据我所知,编译器需要有关类型的信息来获取其大小并计算访问数据的偏移量
有没有办法让我自己去做?直接对字节进行操作,比如
void set(array* a, int idx, void* val, int size) {
*((char*)a->data + size * idx) = val;
}
基本上,我想让它们类似于围棋片。您可以在此处阅读其内置泛型类型:
没有模板,没有拆箱。它们使用
void*
来存储数据。首先,您需要使用void**data-来存储数组,而不是一个指向元素的指针
从你所拥有的
[a->data=(void*)val;]应该可以正常运行
它只是指向数据的指针,可以存储为void。您需要知道当您要取消引用数据时如何读取数据
如果val指向一个int-为了读取它,您必须强制转换它,让编译器知道要读取多少字节。
所以:*(int*)(a->data) 我认为
memcpy
应该满足您的需求:
void set(array* a, int idx, void* val, int size) {
memcpy(a->data + size * idx, val, size);
}
您想要一个统一类型的“数组”,还是每个元素都可以是不同的类型?请看我的回答:这提供了一个基线和几个变体,其中一个可能会符合您的喜好。@Swardfish,每个元素都有相同的类型。我想像围棋一样做。没有模板和拆箱的动态数组。这里是第二部分:您可以使用各种方法(例如
开关
、虚拟函数表等),但接下来我必须为数据中的每个void*执行N个malloc,对吗?如果您得到数组的长度:a->data=(void**)calloc(_initSize,1);例如,当您创建数组以添加新元素时:静态void AddData(数组*a,void*\u item){*(a->data+a->curr\u cap)=\u item;++(a->curr\u cap);}谢谢!我真的应该考虑一下。函数的源代码对于理解指针在C中的工作方式也很有用:
void set(array* a, int idx, void* val, int size) {
memcpy(a->data + size * idx, val, size);
}