浅草夏洛洛 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 C++使用Gunplot
  • ¥15 这个电路是如何实现路灯控制器的,原理是什么,怎么求解灯亮起后熄灭的时间如图?
  • ¥15 matlab数字图像处理频率域滤波
  • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
  • ¥15 ELGamal和paillier计算效率谁快?
  • ¥15 file converter 转换格式失败 报错 Error marking filters as finished,如何解决?
  • ¥15 Arcgis相交分析无法绘制一个或多个图形
  • ¥15 关于#r语言#的问题:差异分析前数据准备,报错Error in data[, sampleName1] : subscript out of bounds请问怎么解决呀以下是全部代码:
  • ¥15 seatunnel-web使用SQL组件时候后台报错,无法找到表格
  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)