如何在不知道数据类型的情况下写入void指针?

时间:2018-11-13 02:59:16

标签: c adt dynamic-memory-allocation void-pointers

我正在尝试使用C中的单链接列表为通用堆栈编写代码。我正在尝试使用(void *)作为其每个函数中的数据类型,例如:

node* getNode(void *, size_t);

void append(node **, size_t);

每个节点的结构为:

typedef struct linked_list{
void *data;
struct linked_list *next; }node;

在上面提到的getNode函数中,我正在尝试这样做:

node* getNode(void *data, size_t data_size) {
   node *newNode;
   newNode = (node *)malloc(sizeof(node));
   newNode->next = NULL;
  // this line should assign the void *data to the data part of the node
   return newNode;}

我不知道如何分配数据部分,而仅使用data_size变量,不知道数据类型。我发现了有关memcopy函数的信息,但是即使那样也需要数据类型。

请帮助。

1 个答案:

答案 0 :(得分:3)

如果只想保存指向数据的指针,则可以复制该指针:

newNode->data = data;

如果要复制其指向的内容,则需要malloc来获取内存,并需要memcpy来复制字节:

newNode->data = malloc(data_size);
memcpy(newNode->data, data, data_size);

memcpy的签名是:

void *memcpy(void *dest, const void *src, size_t n);

这是为了复制通用内存,因此您可以为源和目标传递void *