为什么指针在释放后会变量存储其先前存储的地址的新地址?

Bre*_*ius -4 c malloc free dynamic-memory-allocation

我有两个问题.

  1. freeC 中的函数如何工作?
  2. 为什么指针变量会自行更新以存储新地址?

这是我的代码:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a;
    int *p;
    p = (int *)malloc(sizeof(int));
    *p = 10;
    int *q = p;
    printf("p:%d\n", p);
    printf("q:%d\n", q);
    printf("*p:%d\n", *p);
    printf("*q:%d\n", *q);
    free(p);
    printf("Memory freed.\n");
    p = (int *)malloc(sizeof(int));
    *p = 19;

    printf("p:%d\n", p);
    printf("q:%d\n", q);
    printf("*p:%d\n", *p);
    printf("*q:%d\n", *q);
}
Run Code Online (Sandbox Code Playgroud)

为什么输出是这样的?

p:2067804800
q:2067804800
*p:10
*q:10
Memory freed.
p:2067804800
q:2067804800
*p:19
*q:19
Run Code Online (Sandbox Code Playgroud)

Sou*_*osh 6

一旦调用free()malloc()-ed指针,内存(返回的指针)就可以通过对malloc()family的任何后续调用重新分配.这是关键所在free().

引用C11,章节§7.22.3.3

free函数使得指向的空间ptr被释放,即可用于进一步分配.[....]

所以,很有可能,free()在你malloc()再次为相同数量的内存使用相同的指针之后,返回相同的指针.毫无疑问.

(谁知道,如果你的编译器足够智能,它实际上可以删除无效的free(p);p = (int*)malloc(sizeof(int));完全无效的)

接下来,在代码的最后一行,

 printf("*q:%d\n", *q);
Run Code Online (Sandbox Code Playgroud)

您通过尝试访问(取消引用)已经空闲的内存来调用未定义的行为.不要那样做.

那说,

  1. 要打印指针,您应该使用%p格式说明符并将参数转换为void*.
  2. 请参阅此讨论,了解为什么不投出malloc()和家人的回报值C..