gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 21:14:19 27 4
gpt4 key购买 nike

我有两个问题。

  1. free 怎么样? C 函数可以工作吗?
  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);
}

怎么输出是这样的?

p:2067804800
q:2067804800
*p:10
*q:10
Memory freed.
p:2067804800
q:2067804800
*p:19
*q:19

最佳答案

一旦对 malloc() 化的指针调用 free() ,内存(返回的指针)就可以通过任何后续调用重新分配malloc() 系列。这就是 free() 的全部意义。

引用 C11,第 §7.22.3.3 章

The free function causes the space pointed to by ptr to be deallocated, that is, made available for further allocation. [....]

因此,很可能在 free() 之后,当您再次使用 malloc() 为相同的内存量使用相同的指针时,会得到相同的结果指针被返回。这并不奇怪。

(谁知道呢,如果你的编译器足够聪明,它实际上可以删除无效的 free(p);p = (int*)malloc(sizeof( int)); 总共)

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

 printf("*q:%d\n", *q);

您调用 undefined behavior通过尝试访问(取消引用)已经释放的内存。不要这样做。

也就是说,

  1. 要打印指针,您应该使用 %p 格式说明符并将参数转换为 void*
  2. Please see this discussion on why not to cast the return value of malloc() and family in C. .

关于c - 为什么指针变量在释放后会存储其先前存储的地址的新地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37110225/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com