C 中的悬空指针

Dangling pointers in C

当使用 malloc 为指针分配内存时,指针(比如 x)现在将指向内存地址。 后来我释放了这个(x)内存指针,但指针仍然指向它的旧内存。 现在这将创建悬挂指针。 (因为我free后没有把旧指针指向NULL)

现在,假设我使用 malloc 并假设新指针 (y) 现在指向与旧指针 (x) 相同的内存位置 将新指针 (y) 设置为 0 不能解决悬挂指针问题。

假设我只有一个结构 type.So 我所做的每个 malloc 总是具有相同大小的相同结构。 如果它是不同的结构,我知道如果新指针 (y) 的内存分配比指针 (x)

小,我可能仍然在结构的末尾有一些数据

如果您在释放悬挂指针后尝试使用它们,那么它们只是一个问题。

是的,新分配可能 return 具有与 x 相同的地址。但是你永远不知道这是否会发生,所以你仍然不能再使用 x 了。如果它的地址再次有效,那只是巧合。

即使您一直分配和释放相同的大小,也不会期望它会继续重复使用相同的地址。

为了安全起见,您必须假设释放的指针永远不会再次有效。

术语悬空指针意味着它指向的内存中的任何地址都是无效的。如果你让它有效,就像你的第二个 malloc,那么地址就有效了。如果您将相同的地址存储在两个不同的变量中(根据您的假设),两者都是有效的指针:

#include <stdio.h>
#include <stdlib.h>


struct s { int i; };


int main() {
    struct s *p = malloc(sizeof(struct s));
    printf("before: %p\n", (void *) p);
    free(p);
    // p is dangling
    printf("after:  %p\n", p);

    struct s *p2 = malloc(sizeof(struct s));
    // p and p2 are valid
    printf("before: %p\n", (void *) p2);
    free(p2);
    // p and p2 are dangling
    printf("after:  %p\n", p2);
}

以及我令人满意的 malloc 输出:

before: 0x561b73d3b260
after:  0x561b73d3b260
before: 0x561b73d3b260
after:  0x561b73d3b260