#include <stdio.h>
#include <malloc.h>

//测试free()函数是否会释放结构体指针里的指针指向的内存地址? 
// 答案是: 不会,free()只会将该结构指针所拥有的内存释放,但是,
//    在不把该结构体指针置为NULL前,该结构体里的指针还是可以访问所指向的内存地址的。
// 所以,使用free()释放内存后,必须把指针置为NULL. 
typedef struct _Node
{
    int data;
    struct _Node* prev;
    struct _Node* next;
}NODE,*PNODE;

int main()
{
    NODE* nd = (NODE*)malloc(sizeof(NODE));
    NODE* nd2 = (NODE*)malloc(sizeof(NODE));
    nd->data = 10;
    nd->prev = nd2;
    nd->next = nd2;
    
    nd2->data = 11;
    nd2->prev = nd;
    nd2->next = nd;
    
    printf("nd Address = %p\t nd value = %d\n", nd, nd->data);
    printf("nd2 Address = %p\t nd2 value = %d\n", nd2, nd2->data);
    
    printf("nd->prev Address = %p\t nd->next = %p\n", nd->prev, nd->next);
    printf("nd2->prev Address = %p\t nd2->next = %p\n", nd2->prev, nd2->next);
    
//    free(nd->prev);
//    free(nd->next);
    free(nd);
    printf("nd->next %p \n",nd->next);    
    //    在没有把该指针置为NULL前,是可以访问已经被free()释放内存
    //    的结构体里的指针所指向的内存地址。 
    nd = NULL;
    //printf("nd->next %p \n",nd->next); 非法访问内存 
    printf("nd2 Address = %p\t nd2 value = %d\n", nd2, nd2->data);
    free(nd2);
    nd2 = NULL;
    //printf("nd2->prev Address = %p\t nd2->next = %p\n", nd2->prev, nd2->next);
    return 0;
}

c free()函数了解相关推荐

  1. 数据库中自定义排序规则,Mysql中自定义字段排序规则,Oracle中自定义字段排序规则,decode函数的用法,field函数的用法

    数据库中自定义排序 场景:有一张banner表,表中有一个status字段,有0, 1, 2三个状态位,我想要 1,0,2的自定义排序(这里是重点),然后再进行之上对sequence字段进行二次排序( ...

  2. Mysql函数group_concat、find_in_set 多值分隔字符字段进行数据库字段值翻译

    Mysql函数group_concat.find_in_set进行数据库字段值翻译 场景 配方表:记录包含的原料 sources表示原料,字段值之间用逗号分隔 原料表:对应原料id和原料名称 现需要查 ...

  3. C++ 笔记(34)— C++ exit 函数

    当遇到 main 函数中的 return 语句时,C++ 程序将停止执行.但其他函数结束时,程序并不会停止.程序的控制将返回到函数调用之后的位置.然而,有时候会出现一些非常少见的情况,使得程序有必要在 ...

  4. C++ 笔记(30)— 友元函数与友元类

    我们知道类的私有成员只能在类的成员函数内部访问,如果想在别处访问对象的私有成员,只能通过类提供的接口(成员函数)间接地进行.这固然能够带来数据隐藏的好处,利于将来程序的扩充,但也会增加程序书写的麻烦. ...

  5. 浅显易懂 Makefile 入门 (07)— 其它函数(foreach 、if、call、origin )

    1. foreach 函数 foreach 函数定义如下: $(foreach <var>,<list>,<text>) 函数的功能是:把参数 <list&g ...

  6. 浅显易懂 Makefile 入门 (06)— 文件名操作函数(dir、notdir、suffix、basename、addsuffix、addperfix、join、wildcard)

    编写 Makefile 的时候,很多情况下需要对文件名进行操作.例如获取文件的路径,去除文件的路径,取出文件前缀或后缀等等. 注意:下面的每个函数的参数字符串都会被当作或是一个系列的文件名来看待. 1 ...

  7. Go 学习笔记(65)— Go 中函数参数是传值还是传引用

    Go 语言中,函数参数传递采用是值传递的方式.所谓"值传递",就是将实际参数在内存中的表示逐位拷贝到形式参数中.对于像整型.数组.结构体这类类型,它们的内存表示就是它们自身的数据内 ...

  8. Go 学习笔记(61)— Go 高阶函数、函数作为一等公民(函数作为输入参数、返回值、变量)的写法

    函数在 Go 语言中属于"一等公民(First-Class Citizen)"拥有"一等公民"待遇的语法元素可以如下使用 可以存储在变量中: 可以作为参数传递给 ...

  9. C++ 笔记(26)— 主函数 main(int argc, char *argv[]) 参数说明

    带形参的 main 函数,如 int main( int argc, char* argv[], char **env ) 是 UNIX .Linux 以及 Mac OS 操作系统中 C/C++ 的 ...

  10. OpenCV 笔记(09)— 常用的数据结构和函数(Vec、Point、Scalar、Size、Rect、cvtColor)

    1. Vec 对象类型 Vec 是一个主要用于数值向量的模板类.我们可以定义向量的类型和组件的数量: Vec<double, 19> myVector 我们还可以使用任何的预定义类型: t ...

最新文章

  1. APUE(第五章)标准IO
  2. Python: generator, yield, yield from 详解
  3. Nginx 0.8.x + PHP 5.2.13(FastCGI)搭建胜过Apache十倍的Web服务器(第6版)
  4. 2021年春季学期期末统一考试 高级财务会计 试题
  5. linux 系统安装mongodb数据库---方法1
  6. 二叉树C++ | 广度优先遍历(层级顺序遍历)_2
  7. PHP分组聊天室--fooking现实
  8. 解决WEB页面上焦点控制一法
  9. 数据分析数据挖掘(四)
  10. Bzoj 4408: [Fjoi 2016]神秘数 可持久化线段树,神题
  11. Python数据处理 - 查看海量图片
  12. 私藏的18个黑科技网站,想找什么软件就找什么软件!!!
  13. 教大家通过node爬取b站api数据
  14. 【JavaScript联系练习】实现一个打点计时器
  15. 我是如何零基础开始能写爬虫的
  16. 【LeetCode】 贴纸拼词(动态规划)
  17. Qt利用QGraphicsScene编写Word排版工具导出PDF
  18. WeakHashMap相关
  19. 黄页 - 埃及的官方网上商业指南和本地搜索引擎
  20. leetcode 大礼包

热门文章

  1. java复习之tomcat配置详解
  2. 传播延迟与传输延迟以及带宽时延积
  3. 子类与父类的同名成员调用和注意事项
  4. Win32ASM学习[16] :乘除指令: MUL、IMUL、DIV、IDIV
  5. 百钱百鸡问题(C++枚举法)
  6. linux如何查看ip
  7. java重置按钮功能函数_Bootstrap按钮功能之查询按钮和重置按钮
  8. 中国移动呼叫转移设置
  9. js复制文本(带文本格式or不带文本格式)
  10. paymob QB冲值接口