关于c语言中free以及指针的问题

先上代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct ListNode 
{
     int val;
     struct ListNode *next;
};
int main()
{
     struct ListNode *ptr = (struct ListNode*)malloc(sizeof(struct ListNode));
     ptr->val = 2;
     ptr->next = NULL;
     struct ListNode *qtr = (struct ListNode*)malloc(sizeof(struct ListNode));
     qtr->val = 8;
     qtr->next = NULL;

     ptr->next = qtr;
         free(qtr);//对该句进行修改
     while(ptr)
     {
          printf(" %d\n",ptr->val);
          ptr = ptr->next;
     }
}

1、输出错误,这里的原因如下,执行free后qtr并不是NULL;

    free(pointer); 释放的是指针指向的内存。注意,释放的是内存,不是指针。指针并没有被释放,指针仍然指向原来的存储空间。指针是一个变量,只有程序结束时才被销毁。释放了内存空间后,原来指向这块空间的指针还是存在,只不过现在指针指向的内容是垃圾,是未定义的。因此,释放内存后把指针指向 NULL,防止指针在后面不小心又被解引用了。

作者:ForeverStrong
来源:CSDN
原文:https://blog.csdn.net/chengyq116/article/details/79079389
版权声明:本文为博主原创文章,转载请附上博文链接!

2、将free(qtr);后面再添加qtr = NULL;
执行错误。

3、将free(qtr)改成qtr = NULL;
执行正确。

我想问的就是造成2、3的区别,在2中,free后,qtr与原来的链表已经没有联系了吗?个人推测,ptr->next在1里面指向依然是qtr,而qtr指向的是一个垃圾空间。在2里面,改变了qtr的值后,ptr->next为什么没有指向NULL?

感激不尽。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct ListNode 
{
     int val;
     struct ListNode *next;
};
int main()
{
     struct ListNode *ptr = (struct ListNode*)malloc(sizeof(struct ListNode));
     ptr->val = 2;
     ptr->next = NULL;
     struct ListNode *qtr = (struct ListNode*)malloc(sizeof(struct ListNode));
     qtr->val = 8;
     qtr->next = NULL;

     ptr->next = qtr;
     while(ptr)
     {
          printf(" %d\n",ptr->val);
         struct ListNode * tofree =  ptr;
          ptr = ptr->next;
         free(tofree);
     }
}

你不能fee一个NULL的指针,也不能对相同内存空间free两次。