Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何在运行时将任何类型存储在void*中?_C_Byte_Dynamic Arrays - Fatal编程技术网

C 如何在运行时将任何类型存储在void*中?

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'是不可赋值的 据我所知,编译器需要有关类型的信息来获取其大小并计算访问数据的偏移量 有没有办法让我自

我正在用C编写一个动态数组:

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);
}