浅草夏洛洛 2019-07-14 11:13 采纳率: 100%
浏览 1183

关于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?

感激不尽。

  • 写回答

1条回答 默认 最新

  • threenewbee 2019-07-14 15:04
    关注
    #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两次。

    评论

报告相同问题?

悬赏问题

  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料
  • ¥15 使用R语言marginaleffects包进行边际效应图绘制
  • ¥20 usb设备兼容性问题
  • ¥15 错误(10048): “调用exui内部功能”库命令的参数“参数4”不能接受空数据。怎么解决啊
  • ¥15 安装svn网络有问题怎么办