打印功能未正确读取释放的值
Print function not reading freed values correctly
我正在使用搜索树,为了查看树是否结束,我检查它是否为空。
我的问题是当我使用 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()
后,它不会将指针设置为空,而是使其无效。这意味着进一步访问该指针地址会导致未定义的行为。您根本无法从已释放的内存中访问或打印信息。但是,您可以释放一个指针,然后自己立即将其设置为空——这是一件完全有效的事情。如果您已经这样做但仍然有问题,那么我怀疑您的问题出在其他地方。
这是预期的行为。您可以在 The GNU C Library.
上找到有关 free()
函数的文档
Freeing a block alters the contents of the block. Do not expect to find any data (such as a pointer to the next block in a chain of blocks) in the block after freeing it.
正如 Hiko 所提到的,在调用 free()
后将指针分配给 NULL
是一个好习惯。
所以,
free (b);
b = NULL;
将解决您的问题。
编辑: 根据@Seb 在评论中的建议,同时检查 The POSIX manual for free()
.
我正在使用搜索树,为了查看树是否结束,我检查它是否为空。 我的问题是当我使用 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()
后,它不会将指针设置为空,而是使其无效。这意味着进一步访问该指针地址会导致未定义的行为。您根本无法从已释放的内存中访问或打印信息。但是,您可以释放一个指针,然后自己立即将其设置为空——这是一件完全有效的事情。如果您已经这样做但仍然有问题,那么我怀疑您的问题出在其他地方。
这是预期的行为。您可以在 The GNU C Library.
上找到有关free()
函数的文档
Freeing a block alters the contents of the block. Do not expect to find any data (such as a pointer to the next block in a chain of blocks) in the block after freeing it.
正如 Hiko 所提到的,在调用 free()
后将指针分配给 NULL
是一个好习惯。
所以,
free (b);
b = NULL;
将解决您的问题。
编辑: 根据@Seb 在评论中的建议,同时检查 The POSIX manual for free()
.