先上代码
#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;
作者: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两次。