gpt4 book ai didi

c - 如何访问已释放内存位置的节点内的数据?

转载 作者:行者123 更新时间:2023-11-30 15:04:58 25 4
gpt4 key购买 nike

我试图在释放节点后返回节点中的数据。但是当我尝试这样做时,我收到了段错误(我的猜测是,当我将 elem 值分配给变量 data 时,它只复制引用。释放节点的内存位置后,我们会丢失节点内的成员 elem struct。因此通过其引用检索 elem 是非法的。)。还有其他方法吗?

void* remove_node(struct s_node** node){
if(node != NULL && *node!= NULL && (*node)->elem != NULL){
void* data = (*node)->elem;
if((*node)->prev == NULL && (*node)->next == NULL){
free(*node);
}else if((*node)->prev == NULL){
(*node)->next->prev = NULL;
(*node)->next = NULL;
free(*node);
}else if((*node)->next == NULL){
(*node)->prev->next = NULL;
(*node)->prev = NULL;
free(*node);
}else{
(*node)->prev->next = (*node)->next;
(*node)->next->prev = (*node)->prev;
(*node)->prev = NULL;
(*node)->next = NULL;
free(*node);
}
return data;
}else{
return NULL;
}

}

这是结构

struct s_node {
void* elem;
struct s_node* next;
struct s_node* prev;
};

最佳答案

发布的代码似乎不会导致您观察到的错误。树结构可能会在其他地方被损坏。

但请注意,它可以大大简化:

void *remove_node(struct s_node **node) {
if (node != NULL && *node != NULL && (*node)->elem != NULL) {
void *data = (*node)->elem;
if ((*node)->prev != NULL) (*node)->prev->next = (*node)->next;
if ((*node)->next != NULL) (*node)->next->prev = (*node)->prev;
free(*node);
*node = NULL; /* safely, cannot hurt */
return data;
} else {
return NULL;
}
}

关于c - 如何访问已释放内存位置的节点内的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40052393/

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