先上代码
#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?
感激不尽。