【问题标题】:How to access the data inside a node whose memory location has been freed?如何访问已释放内存位置的节点内的数据?
【发布时间】:2016-10-14 21:39:07
【问题描述】:

我试图在释放节点后返回节点中的数据。但是当我尝试这样做时收到段错误(我的猜测是,当我将 elem 值分配给变量数据时,它只复制引用。在释放节点的内存位置后,我们丢失了节点内的成员 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;
};

【问题讨论】:

  • 在释放它之前复制它
  • 为什么在你完成之前释放它?
  • 到目前为止,与其他评论者相反,我认为您的代码没有任何本质上的错误。它似乎不是您要释放的数据,而是一个包含指向该数据的 指针 的节点。实际上,您在释放节点之前确实复制了所需信息(指向数据的指针)。这里没有足够的信息来确定问题所在;如果您提供minimal reproducible example,您更有可能获得帮助。
  • @Echo111,你是否为elem分配了内存无关紧要。您无需分配内存即可获得有效指针。事实上,elem 是否是一个有效的指针甚至对你提供的代码都无关紧要。我们无法仅针对您目前提供的内容为您提供帮助。
  • 只有在其elem 成员不是NULL 时才删除该节点。这是有意的还是可能有副作用?你也可以在调用free(*node);后设置*node = NULL

标签: c linked-list segmentation-fault


【解决方案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;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-10
    • 2014-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-24
    • 1970-01-01
    相关资源
    最近更新 更多