【发布时间】:2017-05-01 05:52:49
【问题描述】:
下面的代码有些混乱。
我使用 malloc() 分配内存,释放它,然后使用与参数相同的指针 ptr 调用 realloc(),但不要使用 realloc 的返回地址。
此代码编译并运行良好的打印预期字符串。我没想到它会因为 ptr 之前被释放。
但是,如果我将 realloc() 的返回地址分配给 ptr,而将其注释掉,那么当然会出现预期的运行时错误,因为 ptr 将为 NULL。
如果我只是将先前释放的 ptr 作为参数传递,为什么它会起作用。它显然再次分配内存?提前致谢。
注意:故意编写此代码只是为了尝试了解后台发生的情况。当然不建议取消引用悬空指针等。
#include <stdio.h>
#include <stdlib.h>
int main()
{
char* ptr;
ptr = (char*)malloc(20);
strcpy(ptr, "Hello");
printf("Address before free : %d\n", ptr);
printf("%s\n", ptr);
free (ptr);
printf("Address after free : %d\n", ptr);
printf("%s\n", ptr);
realloc(ptr, 30);
//ptr = realloc(ptr, 30); // causes runtime problem as expected
strcpy(ptr, "Hello");
printf("Address after realloc : %d\n", ptr);
printf("%s\n", ptr);
return 0;
}
【问题讨论】:
-
您在使用
ptr调用free后取消引用它,这会导致 未定义的行为。您还使用错误的格式来打印 also 导致未定义行为的指针(您应该使用"%p"打印void*指针(并且您确实需要将指针转换为 @ 987654326@ 有效))。整个程序只是未定义行为的一个大展示。它所做的任何事情都不能真正被相信是正确的。 -
逻辑上也想一想。如果
realloc函数需要实际分配新内存并将数据复制到其中,那么它将返回指向新分配内存的指针。如果您不使用它,那么ptr仍将指向旧内存。 -
如果你在
ptr被释放后调用realloc(ptr, 30);,你会得到未定义的行为。 -
顺便说一句,您可以进行一个简单更改以使
realloc调用再次有效:使ptr成为空指针。然后realloc的行为就像malloc。 -
铸造
malloc和朋友在C语言中是没用的。
标签: c pointers free dynamic-memory-allocation realloc