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

问题描述 投票:0回答:1

我试图在释放节点后返回节点中的数据。但是当我尝试这样做时,我收到了段错误。 (我的猜测是,当我将 elem 值分配给变量 data 时,它仅复制引用。释放节点的内存位置后,我们会丢失节点结构内的成员 elem 。因此通过以下方式检索 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;
};
c linked-list segmentation-fault
1个回答
1
投票

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

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

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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.