C语言的一大精髓就在于动态内存管理,今天我们就来解析一下C语言的动态内存。
动态内存这里主要是四个函数。
目录
这四个函数的头文件都是<stdlib.h>,接下来来认识这四个函数。
1、malloc
首先要了解的一个函数是malloc,先来看看这个函数的参数和返回类型。
void* malloc (size_t size);
先来理解这个返回类型,malloc是向内存申请一块空间,那这个void*的返回类型就很好理解了,就是把申请的这块空间的地址返回来,因为是void*,我们需要什么指针类型完全可以自由转换。这个参数size_t size是指向内存申请了多少个空间的字节,因为申请的空间数不能是负数吧,所以这里用size_t其实也就是unsigned int。如果这里的size是0的话,那么这个malloc函数的行为由编译器决定,实际开发中我们尽可能避免这样无厘头的写法。如果申请失败则返回空指针,所以使用前应该判断一下返回值是否是空指针来判断是否申请成功。
2、free
与malloc对应的一个函数是free。我们也是先来看看这个函数的参数和返回类型。
void free (void* ptr);
返回类型为void说明没有链接属性,参数为void* ptr,这里的参数是向内存申请的空间的地址。
free的意思是释放掉向内存申请的空间,讲这一部分空间还给操作系统。这里有两点要注意的,
第一,如果free参数不是向内存动态开辟的空间,那么free函数的行为未定义,第二,如果free的参数是空指针NULL那么free不执行任何行为。
3、calloc
接下来是calloc,这个函数和malloc很像。来看看参数和返回类型:
void* calloc (size_t num, size_t size);
返回类型和malloc一样,意思也是一样的都是申请空间的地址。与malloc不同的点在于参数部分,这里的参数由两部分构成,这里的size是指申请的空间每个元素的大小是多少字节,num表示申请多少个这样的元素。链接属性也和malloc一样。需要注意的是calloc申请的空间会默认把所有字节初始化成0。如果申请失败的话同样也是会返回一个空指针,同样应该判断一下是否申请成功。
4、realloc
最后但是最精髓的函数时realloc,这个函数需要结合上面的函数使用,动态内存管理的动态就体现在realloc上。来观察一下参数和返回类型:
void* realloc(void* ptr, size_t size);
realloc是用来调整申请的动态内存空间的。当我们前面申请的空间太大或者太小时候都可以通过realloc来调整。返回值不必多说了,和malloc,calloc一样的。参数部分ptr就是我们感觉不满意的动态内存部分,size就是我们希望把这部分内存调整到多大。这里有挺多细节的,如果我们申请的空间后面的部分无法申请,那么realloc会去别的地方找一块空间申请来用,并把之前的空间还给操作系统,所以我们使用realloc之后要更新接收空间的变量。如果内存中找不到可申请的部分,同样也会返回空指针。
动态内存管理部分就讲这些了。