在声明数组的时候,我们需要考虑数组应该有多大?在很多的情况下,我们并不清楚要定义的这个数组到底有多大,此时我们就要把数组定义得足够大。这样程序在运行时就申请了固定大小的足够大的内存空间。但是如果程序需要的元素比较少时,内存空间就被浪费掉了。少数情况下我们定义的数组不够大,这时候就可能引起下标越界错误。这是时候可以用动态内存分配就可以解决上面的问题. 所谓动态内存分配就是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。动态内存分配不象数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小。
C函数库提供了两个函数,malloc 和 free,分别用于执行动态内存分配和释放。原型如下所示:
void *malloc( size_t size);
void free( void *pointer);
malloc的参数就是需要分配的内存字节(字符)数。若内存池中可用内存可以满足需求,malloc就返回一个指向被分配的内存块起始位置的指针,当可用内存无法满足要求时就会返回一个NULL指针。因此每个从malloc返回的指针都要检查确保它非NULL。
free的参数必须要么是NULL,要么是一个先前从malloc、calloc或realloc返回的值。
另外还有两个内存分配函数,calloc 和 realloc。原型如下所示:
void *calloc( size_t num_elements, size_t element_size);
void realloc( void *ptr, size_t new_size);
calloc也用于分配内存。它在返回指向内存的指针前把它初始化为0。
realloc函数用于修改一个原先已经分配的内存块的大小。如果扩大内存块,原来的内容保留,新加的添到原先的后面。如果缩小内存块,该内存尾部的部分内存被拿掉,剩余部分原先内容依然保留。