OS_MEM   *OSMemCreate (void *addr, INT32U nblks, INT32U blksize, INT8U *err)   {

..............................................

plink = (void **)addr;    /* Create linked list of free memory blocks当上述条件都得到满足时,所要建立的内存分区内的所有内存块链接成一个单向链表。这里之所以用单向链表,是因为在单向链表中插入和删除元素都是从链表的 顶端开始向下执行的。内存区可使用静态二维数组或者在初始化时使用malloc()建立,因为malloc()返回值为void*所以这里是 (void **)addr;其实此时plink里面存放的也是当前内存块的地址*/

pblk   = (INT8U *)addr + blksize; /*pblk指向将被释放的内存控制块的指针。如果在此处不是很理解,请参看谭浩强C语言的多维数组与指针一节。其实此时pblk就是链表的下一个内存块的地址*/

for (i = 0; i < (nblks - 1); i++) {               /*这里也体现了nblk应该大于等于2*/

*plink = (void *)pblk;  /*在plink所指向的地址内存入指针pblk,这样此时这个plink指向的单元的头

四个字节中存入了链表的下一个内存块的地址。*/

plink   = (void **)pblk;    /* plink和pblk指向同一地址    (void **)pblk 这样转换了类型 但是pblk的

值并不改变,于是这样把pblk的值赋给了plink*/

pblk    = pblk + blksize;   /*指针pblk指向地址(plbk + blksize);这一段程序建立了一个内存分区,该内

存分区由nblks个大小为blksize的内存块组成.所有的内存块以单联表的形式连接在一起。单联表的指针域在每个内存块的头四个 字节内(一个指针占用四个字节).注意一个指针的大小决定于所用编译器 TC运行在16位模拟器中所以指针大小是16位即2字节   而 现在大多数编译器运行在32位模拟器中所以指针大小是32位即4字节。

}

..........................................................

最新文章

  1. CodeForces - 274B Zero Tree
  2. hdu FatMouse&#39;s Speed 动态规划DP
  3. vs2010 在64bits系统下编译
  4. 关于javascript tween的学后小感想
  5. Spring应用——事务管理
  6. Vnc viewer与windows之间的复制粘贴
  7. java字符串替换函数高效实现
  8. 模拟实现STL中的list
  9. 基于HTML5 SVG炫酷文字爆炸特效
  10. HW6.7
  11. svg学习笔记(一)
  12. 【Java】对服务器程序的理解
  13. 【转】LINUX下一款不错的网站压力测试工具webbench
  14. 执行 npm run update-webdriver 提示文件不能获取错误
  15. handsontable 属性汇总
  16. ABP代码生成器与升级到VS2017VSIX
  17. 聊聊openjdk的BufferPoolMXBean
  18. SMP多核启动
  19. python之datetime类
  20. phpStudy3——往数据库中添加数据

热门文章

  1. uva 10036 Problem C: Divisibility
  2. 我想要个pc和手机共有的客户端,就像百度云(iBarn网盘好用)
  3. Python模块如何安装 并确认模块已经安装好?
  4. 基本排序算法:Python实现
  5. 使用MapReduce查询Hbase表指定列簇的全部数据输出到HDFS(一)
  6. iOS-网络编程(二)文件上传和断点离线下载
  7. Verilog之i2c合约
  8. Flex中的折线图
  9. IRQL_NOT_LESS_OR_EQUAL的问题最终算攻克了
  10. Java基础知识强化47:StringBuffer类之StringBuffer的三个面试题