c - 打印功能未正确读取释放的值



我正在使用搜索树,要查看树是否结束,我检查它是否为空。我的问题是当我使用 free(( 时,指针值不会变为 NULL。

我也尝试使用指针指向 free,然后设置为 NULL,但它不起作用。

在这种情况下,我想删除搜索树上的最大数字,但我的打印函数无法识别释放的值并打印 0。

typedef struct nodo {
    int val;
    struct nodo *l, *r;
}   *ABin;
void print (ABin a) {
     if (a != NULL) {
         print (a -> l);
         printf(" %d ",a -> val);
         print (a -> r);
     }
}
ABin remBiggerA (ABin *a) {
    ABin b = (*a), aux = b;
    int i = 0;
    if (b == NULL) i = 1;
    while (i == 0) {
        if (b -> r == NULL) {
            free (b);
            i = 1;
        }
        else b = b -> r;
    }
    (*a) = aux;
    return aux;
}

在指针上调用free()后,它不会将指针设置为 null,而是使其失效。 这意味着进一步访问该指针地址会导致未定义的行为。 您根本无法从已释放的内存中访问或打印信息。 但是,您可以释放指针,然后立即将其设置为空 - 这是完全有效的做法。 如果您已经这样做并且仍然有问题,那么我怀疑您的问题出在其他地方。

这是预期的行为。您可以在 GNU C 库上找到有关 free() 函数的文档。

释放块会更改块的内容。不要期望在释放块后在块中找到任何数据(例如指向块链中下一个块的指针(。

正如Hiko所提到的,在调用free()后将指针分配给NULL是一种很好的做法。

所以

free (b);
b = NULL;

将解决您的问题。


编辑:按照@Seb在评论中的建议,还要检查 POSIX 手册 free() .

相关内容

  • 没有找到相关文章

最新更新