释放C

时间:2019-01-13 16:35:30

标签: c free

释放指针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;
}

2 个答案:

答案 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