动态存储器分配
大多是 C 程序在运行时会需要额外的存储,并且不能事先知道需要的存储大小,这时候使用一种动态存储分配器(dynamic memory allocator)。C 标准库提供了一个称为 malloc 的程序进行显式存储器分配,使用 free 函数来释放已分配内存,另外还有 calloc 和 realloc 两个函数。
void * malloc (size_t size);
void * calloc (size_t num, size_t size);
void * realloc(void * ptr, size_t size);
void free (void * ptr);
malloc 返回指向 size 个字节的存储块的指针;calloc 返回指向 num * size 个存储器块的指针,即分配 num 个 size 大小的连续存储块,并且存储器初始化为 0. 注意: malloc 并不保证得到存储块初始化为 0;realloc 用在当 malloc 分配的存储块大小不够时,分配更大的块,并将数据复制到新的块。以上三个函数在没有多余的存储可以分配时则都返回 NULL 指针。free 函数则释放 ptr 指针指向的存储器块。
虚拟存储器
虚拟存储器是现代计算机系统中对内存的一个抽象概念,它是由硬件和软件协同工作,提供给每个进程一个大的、一致的、私有的地址空间。简单的说,对一个 n 位的计算机系统,虚拟存储器被组织成存放在磁盘上的,2 ** n 个连续字节大小的数组的连续的地址空间,使用内存作为高速缓存。它为每个进程提供了一个一致的地址空间,从而简化了存储器的管理,并且它保护了每个进程的地址空间不被其他进程破坏(注意这里存储器与内存概念上的区别)。
比如对于 32 位的 Linux 系统,虚拟存储器空间为 2 ^ 32 即 4G, 即进程的寻址空间位 4G, 其中前 3G 划分给用户使用,后 1G 留给操作系统使用。操作系统将用户 3G 的空间划分成了数个 存储器区域,一个区域就是已经分配过的虚拟存储器上连续的一段空间。