动态内存分配 就 是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。动态内存分配不像数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据 程序的需要即时分配,且分配的大小就是程序要求的大小。
2. 函数说明
C语言的动态存储管理由一组标准库函数实现,其原型在标准文件<stdlib.h>里描述,需要用这些功能时应包含这个文件。与动态存储分 配有关的函数共有四个,其中就包括存储分配函数malloc()。函数原型是:void *malloc (size_t n);这里的size_t是标准库里定义的一个类型,它是一个无符号整型。这个整型能够满足所有对存储块大小描述的需要,具体相当于哪个整型由具体的C系 统确定。malloc的返回值为(void *)类型(这是通用指针的一个重要用途),它分配一片能存放大小为n的数据的存储块,返回对应的指针值;如果不能满足申请(找不到能满足要求的存储块)就 返回NULL。在使用时,应该把malloc的返回值转换到特定指针类型,赋给一个指针。
3.malloc()在操作系统中的实现
在 C 程序中,多次使用malloc () 和 free()。不过,您可能没有用一些时间去思考它们在您的操作系统中是如何实现的。本节将向您展示 malloc 和 free 的一个最简化实现的代码,来帮助说明管理内存时都涉及到了哪些事情。
在大部分操作系统中,内存分配由以下两个简单的函数来处理:
void *malloc (long numbytes):该函数负责分配 numbytes 大小的内存,并返回指向第一个字节的指针。
void free(void *firstbyte):如果给定一个由先前的 malloc 返回的指针,那么该函数会将分配的空间归还给进程的“空闲空间”。
malloc_init 将是初始化内存分配程序的函数。它要完成以下三件事:将分配程序标识为已经初始化,找到系统中最后一个有效内存地址 ,然后建立起指向我们管理的内存的指针。这三个变量都是全局变量 :
清单 1. 我们的简单分配程序的全局变量
int has_initialized = 0;
void *managed_memory_start;
void *last_valid_address
.ralloc
(1)函数原型
void *ralloc(void *mem_address,unsigned int newsize);
(2)功能
先判断当前的指针是否有足够的连续空间,如果有,扩大mem_address指向的地址,并且将mem_address返回,如果空间不够, 先按照newsize指定的大小分配空间,将原有
数据从头到尾拷贝到新分配的内存区域,而后释放原来mem_address所指内存区域(注意:原来指针是自动释放,不需要使用free),同时返回新分配的内存区域的首地址。即
重新分配存储器块的地址。
如果重新分配成功则返回指向被分配内存的指针,否则返回空指针NULL。
(3)同样的当内存不在使用时,要用使用free函数将内存释放。
(4)使用ralloc函数的注意事项
(1)ralloc失败的时候,返回NULL。
(2)ralloc失败的时候,原来的内存不改变,不会释放也不会移动。
(3)假如原来的内存后面还有足够多剩余内存的话,ralloc的内存=原来的内存+剩余内存,ralloc还是返回原来内存的地址;假如原来的内存后面没有足够多剩余内存的话,ralloc
将申请新的内存,然后把原来的内存数据拷贝到新内存里,原来的内存将被free掉,ralloc返回新内存的地址。
(4)如果size为0,效果等同于free()。
(5)传递给ralloc的指针必须是先前通过malloc(), calloc(),或ralloc()分配的
(6)传递给ralloc的指针可以为空,等同于malloc。