gpt4 book ai didi

在函数中复制结构体并在c中返回副本

转载 作者:行者123 更新时间:2023-11-30 18:46:27 24 4
gpt4 key购买 nike

我正在使用 C 中的通用链表实现一个队列,其中列表中的每个节点都是一个简单的结构,其中包含一个 void 指针和一个指向下一个节点的节点指针。在出队操作中,我想删除头部(工作正常),但我也想在删除后返回该节点。

已编辑以澄清

我在出队函数中所做的是(示例):

//This is my queue struct
typedef struct Queue{
LinkedList* list;
size_t item_size;
} Queue;

//this is the dequeue function
Node* dequeue(Queue* queue){
Node* head = queue->list->head;
Node* returnedValue = (Node*)malloc(sizeof(Node));
memcpy(returnedValue, head, sizeof(Node));

removeBegin(queue->list);
return returnedValue;
}

//this is the remove head function
void removeBegin(LinkedList* list){
Node* tempHead = list->head;

list->head = list->head->next;
tempHead->next = NULL;
free(tempHead->value);
tempHead->value = NULL;
free(tempHead);
tempHead = NULL;
}

问题是free函数没问题之前的一切。一切都被正确复制。但在 free 函数调用之后,复制到新分配节点的值立即变成垃圾(或 0)。

我调用该函数的方式只是使用此函数初始化队列:

Queue* init_queue(size_t size){
Queue* queue = (Queue*)malloc(sizeof(Queue));
// int x = 10;
queue->list = createList(NULL, size);

return queue;
}

然后调用 dequeue 并将队列的指针传递给它。

我该如何解决这个问题?非常感谢。

最佳答案

内存分配使用

 Node* n1 = (Node*)malloc(sizeof(Node));

未初始化。这意味着访问 n1->value 的值会产生未定义的行为。结果就是

memcpy(n1->value, n->value, sizeof(n->value));

还给出了未定义的行为。

当行为未定义时,执行任何进一步的代码可能会产生任何后果。您的观察

newly allocated node becomes garbage (or 0)

是一种可能的结果。

还有更多问题。但是,您没有提供足够的信息(例如,函数是如何调用的?指针如何作为 n 初始化传递?如何初始化 n->value ?)无法就如何修复您的功能提供建议。

关于在函数中复制结构体并在c中返回副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51559034/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com