我有一个如下情况
#include <stdio.h>
int main(void) {
int *p1=NULL;
int a;
p1=&a;
printf("%p\n",p1);
p1=NULL;
printf("%p\n",p1);
return 0;
}
在这种情况下,我完全没有问题。但如果我按照以下方式使用:
#include <stdio.h>
int main(void) {
int *p1=NULL;
int a;
p1=&a;
printf("%p\n",p1);
free(p1);
printf("%p\n",p1);
return 0;
}
在这种情况下,我得到了运行时错误,如下所示:
运行时错误时间:0内存:2052信号:11
我想知道为什么会这样。据我所知,解放了 指针将执行与分配NULL值相同的事情(当我们这样做时 free(p)它还删除指向内存的指针链接而不是删除 分配内存空间)。如果你能建议我,我宁愿你 任何事情。
先谢谢。
答案 0 :(得分:1)
您正在尝试free()
根本没有分配的内存,这会导致未定义的行为。
因此,您需要在malloc()
调用之前free()
p1 = malloc(sizeof(int));
答案 1 :(得分:1)
答案 2 :(得分:1)
您有未定义的行为:
你只能free
你malloc
编辑的内容。 p1
指向堆叠分配内存,因此不尝试free
。
使用*p1
时也要小心:它与访问a
的规则相同。在对其进行任何其他操作之前,您需要初始化a
(使用a = ...
或使用*p1 = ...
指针)。否则程序行为未定义。