取消引用的指针的值在释放后是否保留?

Does the value of a dereferenced pointer remain after freeing it?

我正在用 C 开发一个项目,我正在制作一个堆栈数据结构。我想知道我是否弹出第一个元素,如果我可以释放它只是为了避免处理潜在的内存泄漏,如果它以后没有被释放。

struct node_s {
    int a;
    int b;
    struct node_s *next;
}

struct list_s {
    struct node_s *head;
    size_t size;
}

typedef struct node_s *nodep_t;
typedef struct list_s *listp_t;

这样的东西行得通吗?

struct node_s pop(listp_t list) {
    struct node_s node = *(list->head);
    nodep_t new_head = list->head->next;
    free(list->head);
    list->head = new_head;
    return node;
}

如果不是,我会按照最初的方式进行操作,稍后手动释放内存:

nodep_t pop(listp_t list) {
    nodep_t node = list->head;
    list->head = list->head->next;
    return node;
}

两者都可以。

正如您所指出的,后者需要 调用者 在完成相关节点后对其进行清理。此外,一旦修复错误检查(你打算修复它,right?),它允许你 return 一个值给调用者,表明 error/empty状态(例如 NULL)。前者不允许这样做。简而言之,第一个版本无法告诉调用者“bad pop”。这就是大多数人部署 pop 机制的原因 没有 结果 returned,一种 top 访问列表前端的访问方法 without 在过程中删除它,以及一个 empty 方法来检查列表是否为空。这三个中的三个是典型的,并提供您需要的功能。

然而,在 两种 情况下,“事物”的 next 成员被 returned(假设在后者中 non-NULL case) 应该在 return 之前被清除为 NULL,以免你有窥探的眼睛窥视你的容器。