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

时间:2016-10-14 21:39:07

标签: c linked-list segmentation-fault

我试图在释放节点后返回节点中的数据。但是当我尝试这样做时我收到了段错误(我的猜测是,当我将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;
};

1 个答案:

答案 0 :(得分: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;
    }
}