Eng*_*999 -2 c free pointers realloc dynamic-memory-allocation
关于我的代码,下面有一些混淆.
我使用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;
}
Run Code Online (Sandbox Code Playgroud)
对于realloc(),具体地说,引用了C11标准,章§7.22.3.5
如果
ptr是空指针,则该realloc函数的行为类似于malloc指定大小的函数.否则,如果ptr与内存管理函数先前返回的指针不匹配,或者如果通过调用freeorrealloc函数释放了空间,则行为未定义.[....]
也就是说,在这种情况下,你通过说,在此 之前就已经调用了未定义的行为
printf("Address after free : %d\n", ptr);
printf("%s\n", ptr);
Run Code Online (Sandbox Code Playgroud)
错误在哪里
%p是指针所需的格式说明符,其中的参数是void *,而不是%dfree()-d内存其中,单独和单独都足以调用UB.
底线:free()在传递指针之前不要尝试指针realloc(),它会自己照顾它.
| 归档时间: |
|
| 查看次数: |
558 次 |
| 最近记录: |