在调用realloc()之前释放内存

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)

Sou*_*osh 6

对于realloc(),具体地说,引用了C11标准,章§7.22.3.5

如果ptr是空指针,则该realloc函数的行为类似于malloc指定大小的函数.否则,如果ptr与内存管理函数先前返回的指针不匹配,或者如果通过调用freeor realloc函数释放了空间,则行为未定义.[....]

也就是说,在这种情况下,你通过说,在此 之前就已经调用了未定义的行为

printf("Address after free  : %d\n", ptr);
printf("%s\n", ptr);
Run Code Online (Sandbox Code Playgroud)

错误在哪里

  • %p是指针所需的格式说明符,其中的参数是void *,而不是%d
  • 尝试使用free()-d内存

其中,单独和单独都足以调用UB.


底线:free()在传递指针之前不要尝试指针realloc(),它会自己照顾它.