原文地址http://www.cnblogs.com/P_awl/archive/2010/04/08/1707852.html

一、自引用结构

1、 什么事自引用结构?

自引用结构(Self-Referential Structure)是一种特殊的结构。主要特征:一个或多个自身的变量是指向自身的指针。

2. 判断几个自引用结构是否合法?
struct SELF_REF1{ int A; struct SELF_REF1 B; int C; };
这个结构是非法的,为什么呢?结构里面有包含B,B里面有包含自己的成员B,这样就会无休止的循环下去。
struct SELF_REF1{ int A; struct SELF_REF1 *B; int C; };

编译器在结构的长度确定之前,就已经知道指针的长度,所以这样自引用是合法的。

二、malloc和free函数

自引用结构的内存分配和使用主要是通过动态存储管理程序(malloc和Free)来显式的分配和释放内存。

1. malloc函数原型
void *malloc(long NumBytes);

该函数分配了NumBytes个字节,并返回了指向这块内存的指针。如果分配失败,则返回一个空指针(NULL)。

2. free函数原型
void free(void *FirstByte);

该函数是将之前用malloc分配的空间还给程序或者是操作系统,也就是释放了这块内存,让它重新得到自由。

3.函数的用法
// Code... char *chPtr = NULL; chPtr = (char *)malloc(100 * sizeof(char)); if (NULL == chPtr) { exit (1); } gets(chPtr); // code... free(chPtr); chPtr = NULL; // code...
4. 注意点
申请了内存空间后,必须检查是否分配成功。
当不需要再使用申请的内存时,记得释放。
虽然malloc()函数的类型是(void *),任何类型的指针都可以转换成(void *),但是最好还是在前面进行强制类型转换,因为这样可以躲过一

些编译器的检查。

5.深入发掘
malloc()到底从哪里得到了内存空间?

从堆里面获得空间。也就是说函数返回的指针是指向堆里面的一块内存。操作系统中有一个记录空闲内存地址的链表。当操作系统收到程序的申请 时,就会遍历该链表,然后就寻找第一个空间大于所申请空间的堆结点,然后就将该结点从空闲结点链表中删除,并将该结点的空间分配给程序
free()到底释放了什么?

free()释放的是指针指向的内存!注意!释放的是内存,不是指针!

参考文献:

1/ 网络文章:http://www.bccn.net/Article/kfyy/cyy/jszl/200608/4238_2.html

2/ Fundamentals of Data Structures in C

3/ Poninter on C

自引用结构兼谈Malloc和Free函数相关推荐

  1. 浅谈malloc,calloc,realloc函数之间的区别

    内存区域可以分为栈,堆,静态存储区和常量存储区.局部变量,函数形参,临时变量都是在栈上获得内存的,它们获取的方式都是由编译器自动执行的. C 标准函数库提供了许多函数来实现对堆上内存管理,其中包括:m ...

  2. C中堆管理—浅谈malloc,free,calloc,realloc函数之间的区别

    2019独角兽企业重金招聘Python工程师标准>>> 在进行C/C++编程的时候,需要程序员对内存的了解比较好清楚,经常需要操作的内存可分为下面几个类别: 堆栈区(stack):由 ...

  3. C语言游戏: 俄罗斯方块(Tetris)@兼谈程序优化方法 [源码+exe下载]

    消除重复:如何将程序逻辑与数据分开? ----俄罗斯方块(Tetris)@兼谈程序优化方法 背景提示: 1,数据,是程序设计的根本.因为任何程序都可以看作是一组数据,和作用于其上的一组操作,这也是面向 ...

  4. zw版·Halcon与delphi(兼谈opencv)

    zw版·Halcon与delphi(兼谈opencv) QQ群 247994767(delphi与halcon) <Halcon与delphi>系列,早两年就想写,不过一方面,因为Halc ...

  5. malloc和free函数详解

    本文介绍malloc和free函数的内容. 在C中,对内存的管理是相当重要.下面开始介绍这两个函数: 一.malloc()和free()的基本概念以及基本用法: 1.函数原型及说明: void *ma ...

  6. 深入理解iPhone委托模式兼谈iPhone生命周期

    深入理解iPhone委托模式兼谈iPhone生命周期(手把手教你iphone开发 - 基础篇) 作者:孙东风 2009-11-23(请尊重作者劳动成果,转载务必注明出处)   每个iPhone应用程序 ...

  7. 朱松纯:初探计算机视觉三个源头兼谈人工智能

    朱松纯   加州大学洛杉矶分校UCLA统计学和计算机科学教授(Song-Chun Zhu:www.stat.ucla.edu/~sczhu) 杨: 朱教授,你在计算机视觉领域耕耘20余年,获得很多奖项 ...

  8. 占豪--2010年的市场机会在哪里(兼谈股指期货与楼市)

    首先,马上要2010年了,这里祝福最广大战友:新的一年平安.快乐.幸福!能<从A股获利>,即使市场熊了也能做到<熊市能赚钱>,但别忘了一切<交易靠自己>,而这一切都 ...

  9. 【转】初探计算机视觉的三个源头、兼谈人工智能

    初探计算机视觉的三个源头.兼谈人工智能|正本清源 2016-12-12 视觉求索 谈话人: 杨志宏 视觉求索公众号编辑 朱松纯 加州大学洛杉矶分校UCLA统计学和计算机科学教授 Song-Chun Z ...

最新文章

  1. 利用链式存储结构实现线性表
  2. js_高级_表格排序案例---分别用面向过程和面向对象实现
  3. 【量化投资】策略四(聚宽)
  4. PHP在WPS中的应用,PHP+Laravel的简单应用教程【ajax的使用】,wps的使用教程
  5. abb外部轴零位校准_RobotStudio软件:机器人自定义行走轴配置与仿真
  6. 蓝桥杯 基础练习 报时助手
  7. KPI总结模板:What
  8. Android应用程序消息处理机制(Looper、Handler)分析(3)
  9. 今年水果贵,咱走网购
  10. 重新认识JavaScript面向对象: 从ES5到ES6
  11. MySQL 插入时,出现‘“Incorrect string value: ‘\\xF0\\x9F\\x98\\x85...‘ for column ‘commens‘ at row 3‘
  12. pagefile.sys占用磁盘空间过大时如何处理
  13. 期货交易 python_strategies/python版CTP商品期货交易类库.py at master · rui/strategies · GitHub...
  14. arch(linux)挂接小鹤音形输入法
  15. 2020北航计算机夏令营
  16. Python中取余、除法、取整的操作逻辑
  17. Xilinx Zynq mpsoc 的 pcie Tandem 配置
  18. HashMap,ArrayMap,SparseArray 源码角度分析,Android中的数据结构你该如何去选择?
  19. 黄健翔,请你像个男人一样去向全国的球迷道歉!(摘自网络)
  20. CCPC2018 桂林 D Bits Reverse

热门文章

  1. NPDP第三章:新产品流程
  2. 高一计算机函数公式,求高一数学函数所有公式
  3. mysql的联接算法_联接算法
  4. 汽车电子——常见的英文缩写(更新中)
  5. Z39.50客户端源代码(C#)
  6. 机器学习课堂笔记-作业二基本实现思路
  7. SDHC ADMA和SDMA区别
  8. vue脚手架安装时出现Error EPERM operation not permitted这个错误
  9. 明日之后 找不到服务器,《明日之后》无法连接服务器怎么解决 服务器无法连接解决方法...
  10. nltk包下载慢的解决方案(总结)