C语言提提供了动态内存开辟以及分配的函数-----在堆上开辟
void malloc(size_t size);*
//参数为申请是的大小,单位为字节
void calloc(size_t num, size_t size);*
//开辟num个大小为size的一块空间
void ralloc(void ptr, size_t size);
//第一个参数为旧地址,第二个为新大小
以上 三者函数区别
malloc
- malloc函数向内存申请一块连续可用的空间,开辟成功则返回指向这块空间的函数,开辟失败,则返回一个空指针;由于返回的是void *,所以malloc并不知道开辟的空间类型,由使用者自己决定。(适合大块内存的申请)
- 函数里面的参数大小单位为字节。
- 使用:int* ptr = (int )malloc(numsizeof(int));
calloc
- 有着和malloc一样是的功能,但有点区别如下:
功能:为num个大小为size的元素开辟一块空间,并把每个字节初始化为全0;
例如:
int *p = calloc(3,sizeof(int)); //申请三个连续为大小为4字节的空间
realloc—申请新的一块空间,且保留原空间的内容
1.realloc函数使得内存动态管理更加灵活(可以调大也可以调小)
- void* realloc(void *ptr, size_t size);
-ptr是要调整的内存地址(旧地址),size是申请的新大小,单位为字节
-
返回值为调整之后内存的起始位置
-
此函数除了调整空间的大小,还会把原来内存中的数据移到新的空间里(复制原来的内容到新的空间里)
realloc函数申请空间时存在两种情况:
1.在原来地址后直接扩展,后面有足够的空间可以扩展
2.原本的地址之后的空间不够大,此时,扩展的方法:在堆上找一个合适的连续空间,开辟一块新的空间,并且拷贝原来的地址中的内容。
free
动态申请的内存必须释放空间,否则会导致内存泄漏
(内存泄漏(存储渗漏)是用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元,直到程序结束。内存泄漏是一种很难定位和跟踪的错误。发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。)
用法:free(ptr);//ptr是申请空间的起始地址