C 为什么指针变量在释放后会存储以前存储的地址的新地址?
我有两个问题C 为什么指针变量在释放后会存储以前存储的地址的新地址?,c,malloc,free,dynamic-memory-allocation,C,Malloc,Free,Dynamic Memory Allocation,我有两个问题 在C语言中,free是如何工作的 指针变量如何更新自身以存储新地址 这是我的代码: #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)
free
是如何工作的#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);
}
在malloc()
-ed指针上调用free()
后,内存(返回的指针)可以通过对malloc()
系列的任何后续调用重新分配。这就是拥有free()
的全部意义所在
引用第§7.22.3.3章中的C11
free
函数使ptr
指向的空间被释放,即生成
可供进一步分配。[……]
因此,很有可能在free()
之后,当您malloc()
为相同的指针重新加载相同的内存量时,返回相同的指针。这并不奇怪
(谁知道呢,如果你的编译器足够聪明,它实际上可以删除无效的free(p);
和p=(int*)malloc(sizeof(int));
)
接下来,在代码的最后一行
printf("*q:%d\n", *q);
您可以通过尝试访问(取消引用)已经空闲的d内存来调用。不要那样做
也就是说
%p
格式说明符并将参数强制转换为void*
malloc()
q
不会更新自身以存储p
的新值。
如果你删除了free(p)
在p=malloc(…
之前,p将获得一个新地址,而q
仍将保留旧地址。有两种未定义的行为。第一种是因为使用错误的格式打印指针,所以应该使用%p”
打印指针。请参见,例如。第二个UB是因为在释放内存后取消引用q
,它指向这样的位置。不能保证您看到的行为会再次发生。一旦释放内存,就不能取消引用指向该内存的指针。输出为“像这样”因为这是您要求的内容(即,这是您的程序打印的内容)。请准确地指定您认为与您发布的内容不同的内容。顺便说一句,您的问题的标题没有任何意义。至于“指针变量更新自身以存储新地址”问题。它没有。您显式地执行p=malloc(…)
这是整个“更新”对于变量。您所做的与例如int a=10;a=20;
没有区别。据说您不需要强制转换malloc的返回值。最后,或任何其他返回void*
的函数。也许您可以添加任何取消引用q
的尝试都是UB,。。
printf("*q:%d\n", *q);