释放指针10
后,代码1 的结果仍然是p
,而p
不是NULL
。
对于每个节点的值,代码2 的输入分别为5
(长度)和1 2 3 4 5
,但是在以下所有节点都不为{的情况下,输出为空{1}}。
我的问题是,根据代码1 的逻辑,是否应该打印节点的所有值,因为它们不是NULL
?
有人可以向我解释吗?非常感谢!
代码1 :
NULL
代码2 :
#include <stdio.h>
#include <stdlib.h>
int main() {
int *p = (int*)malloc(sizeof(int));
*p = 10;
free(p);
if (p != NULL) {
printf("%d\n", *p);
}
return 0;
}
答案 0 :(得分:2)
...基于代码1的逻辑...
代码1访问释放的内存(所谓的悬挂指针),这是未定义的行为。可能发生任何事情,包括但不限于程序崩溃,返回的最后一个值(=您观察到的行为)或程序执行了完全出乎意料的事情。
因此,您不能从“代码1的逻辑”中推断出任何内容。
答案 1 :(得分:0)
拥有
int main(){ int *p = (int*)malloc(sizeof(int)); *p = 10; free(p); if(p!=NULL) { printf("%d\n",*p); } return 0; }
我的问题是,基于代码1的逻辑,不应打印节点的所有值,因为它们不是NULL?
除非没有更多内存,否则 malloc 将起作用,并在 free 后将 p 保持不变,但仍非null,因此代码尝试在空闲内存中读取,这是未定义的行为
有一种更好的方法(尝试)打印一个随机值:-)
在代码2中,是相同的,您可以在 while 和 printf 的测试中以及在分配的值中访问空闲内存。 n