编程时,如果您预先知道数组的大小,那么定义数组时就比较容易。例如,一个存储人名的字符数组,它最多容纳 100 个字符,所以您可以定义数组,如下所示:
char name[100];
但是,如果您预先不知道需要存储的文本长度,就很难预定义字符数组的大小,若数组长度小于存储的文本长度,就会导致内存溢出。若数组长度远大于存储的文本长度,就会导致内存浪费。最好的方式就是根据存储的文本长度,动态分配数组的长度,而不是静态定义数组的长度,这就是C语言的动态内存管理。
C 语言为内存的分配和管理提供了几个函数。这些函数可以在 <stdlib.h> 头文件中找到。
函数声明
void *calloc(int num, int size);
在内存中动态地分配 num 个长度为 size 的连续空间,并将每一个字节都初始化为 0。所以它的结果是分配了 num*size 个字节长度的内存空间,并且每个字节的值都是0。函数返回分配的内存块指针,该指针的类型始终为void*,可以将其转换为所需的数据指针类型。若分配失败,函数返回空指针,即指针为0。
函数声明
void free(void *address);
该函数用于释放 address 所指向的内存空间,该内存空间由内存分配函数分配。
函数声明
void *malloc(int num);
在内存中动态分配一块指定大小的内存空间,用来存放数据。这块内存空间在函数执行完成后不会被初始化,它们的值是未知的。函数返回分配的内存块指针,该指针的类型始终为void*,可以将其转换为所需的数据指针类型。若分配失败,函数返回空指针,即指针为0。
函数声明
void *realloc(void *address, int newsize);
该函数重新分配address指向的内存空间,把内存空间扩展到 newsize。函数返回指向重新分配的内存块的指针,它可以与ptr相同,也可以是新位置。若分配失败,函数返回空指针,即指针为0。