前言
在C语言中,若需要存储数据,则需要向内存申请空间。当我们定义一个变量时,编译器会自动向内存申请空间来储存在这个变量。这种内存管理方式有时是不便利的,它所开辟的内存空间大小是固定的。例如在VS编译器上,由于VS不支持变长数组,当我们需要根据不同情况确定不同的数组大小时较为困难。因此,C语言提供了动态内存管理用来更加灵活地管理内存空间。
一、动态内存函数
C语言提供了四种动态内存函数用以进行动态内存管理,它们分别是malloc、calloc、realloc和free。
1. malloc和free
void* malloc (size_t size);
malloc函数用以开辟一个大小为"size"个字节的内存空间,若开辟成功则返回该空间的起始地址,否则返回空指针。
由于malloc函数在开辟内存空间时有可能失败,因此我们在调用完malloc之后最好是对malloc函数是否成功开辟内存空间进行一次检测,若检测开辟成功,再使用事先定义好的指针变量来接收malloc的返回值,若不成功,则直接报错并结束程序即可。由于malloc函数的返回类型为void*的指针,因此在使用时需强制类型转换成所需指针类型使用。若malloc函数的接收值为0,则它的操作取决于编译器,当然,我们应该避免这种情况的出现。
但是,在动态内存管理中,动态开辟的内存并不会在程序结束后自动释放。因此在动态内存空间使用完毕后,我们最好将该内存空间释放,否则可能会造成内存泄露(包括malloc,calloc,realloc开辟的空间)。这时,我们就需要使用free函数来释放这些空间。
void free (void* ptr);
free函数的接收值ptr为需要释放的动态内存空间的起始地址,若接收到一个有效地址,则会将该地址后的动态内存空间释放,若接收一个空指针,则无事发生(free函数不进行任何操作)。注意,free函数不可用来释放非动态开辟空间。
下面为一段基础的动态内存应用代码。
int main()
{
int* ptr = (int*)malloc(4); //申请动态内存空间
if(ptr == NULL) //检测动态空间是否开辟成功
{
perror("malloc"); //开辟失败报错
retur