动态存储分配
2025年09月21日
第五节 动态存储分配
对于大多数应用来说,应尽可能在编译的时候确定所需要的内存空间并进行分配,事实上大多数程序也是这么做的。但是,对于有些需要使用动态结构(如树和链表)的应用来说,这种方式就不再适用了。Keil C对这种应用提供了较好的支持,动态分配函数要求用户声明一字节数组作为堆,根据所需要的动态内存大小来决定数组的长度。作为堆,被声明的数组在XDATA中,因为C51的库函数使用特定指针来进行寻址。由于51单片机DATA区的空间一般较小,不在DATA区中动态分配内存。从堆中分配的内存需要程序员手动释放,如果不释放,而系统内存管理器又不自动回收这些堆内存(实现这一项功能的系统很少),则该内存一直被占用。
在标准C语言上,使用malloc、free等内存分配函数获取内存是从堆中分配内存,而在一个函数体中的操作是从栈中分配内存。Keil C通过标准C语言的功能函数malloc和free提供了动态存储分配功能。一旦在XDATA中声明了数组(块),指向块的指针和块的大小就要传递给初始化函数init_mem。一旦初始化工作完成,就可以在任何系统中调用以下4个动态分配函数。
malloc:接受一个描述空间大小的unsigned int参数,返回一个指针。
calloc:接受一个描述数量和一个描述大小的unsigned int参数,返回一个指针。
realloc:接受一个指向块的指针和一个描述空间大小的unsigned int参数,返回一个指向按给出参数分配的空间的指针。
free:接受一个指向块的指针,使这个空间可以再次被分配。
以上函数均返回指向堆的指针,如果失败的话则返回NULL。