Chinaunix首页 | 论坛 | 博客
  • 博客访问: 828145
  • 博文数量: 190
  • 博客积分: 2991
  • 博客等级: 少校
  • 技术积分: 2400
  • 用 户 组: 普通用户
  • 注册时间: 2012-09-24 18:11
文章分类

全部博文(190)

文章存档

2015年(3)

2014年(1)

2013年(65)

2012年(121)

我的朋友

分类: C/C++

2012-10-24 16:03:26

C语言中的malloc()函数用于动态地在内存中分配一块空间来存储数据,对于在程序执行过程中需要动态分配内存的应用来说,这是十分有用的功能。

Microchip的编译器C30(16位单片机)以及C32(32位单片机)在较新的版本中也开始实现了这个函数,这为对RAM本来有些捉襟见肘的单片机编程添加了不少灵活性。不过在实际使用过程中有几个需要注意的地方(以MPLab v8.63为例)。

1、需要告知编译器程序中将会使用动态内存分配,不然在16位的单片机中编译会出错,在32位的单片机中编译不会出错,但是在程序运行的时候,会出现malloc分配失败。
选项位于 Project -> Build Option -> MPLab xx Link 这个界面里,找到 Heap Size这个框,在旁边输入动态分配可能需要的字节数即可。另外,实际使用中注意到一个现象,就是输入的字节数大小在实际程序的运行中并不能全部分配到,实际最多只能得到的要比输入的字节数少8个byte的样子,不然malloc返回NULL,即分配空间失败。不知道这是编译器的bug,还是分配空间过程中的自然损耗。

2、程序在第一次分配大空间之前需要“热身”,也就是预分配一次小空间,才能获得设置时设定的最大空间。
比如设置时候输入了heap空间为16384字节(byte),如果跑上来就用malloc函数请求分配这么大的空间,malloc返回NULL,即分配失败。通过反复尝试发现需要在分配大空间之前先malloc哪怕一个byte的空间,然后在用free释放,再用malloc请求大空间,就不会有任何问题。另外,这里的“大”空间要大到heap空间输入值的1/2。以上面的16384为例,如果程序一跑上来请求分配小于8192的空间,就不会有“预热身”的需要。
阅读(1371) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~