目录
1.为什么会存在动态内存分配
栈区:
空间开辟大小固定,数组在声明时必须指定数组长度,所需内存在编译时分配·
有些时候,我们需要的内存空间在程序运行时才知道,因此需要动态内存开辟。
2.动态内存分配函数
因为这些函数是C库函数提供的,所以头文件均是<stdlib.h>
a.malloc
void* malloc (size_t size);
函数功能:
- 向内存申请一块连续可用的空间,并返回指向这块空间的指针.
开辟成功,返回一个指向开辟好空间的指针。
开辟失败,返回一个NULL指针,因此malloc的返回值一定要做检查。(判断是否是空指针,对空指针解引用可是不允许的)
- 返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己来决定(强制类型转换)。
- 如果参数 size 为0,malloc的行为是标准是未定义的,取决于编译器。
b.calloc
void* calloc (size_t num, size_t size);
函数功能:
- 开辟 num 个大小为 size 的一块空间,并且把空间的每个字节初始化为0。
- 与函数 malloc 的区别: calloc 会在返回地址之前把申请的空间的每个字节初始化为全0;
还是要注意在指针使用前要判空!!!
c.realloc
void* realloc (void* ptr, size_t size);
函数功能:
灵活调整内存大小,可大可小,“按需分配”
说明:
ptr 是要调整的内存地址
size 调整之后新大小
返回值为调整之后的内存起始位置。
在调整原内存空间大小的基础上,还会将原来内存中的数据移动到 “新” 的空间。
注意:
若原有空间之后有足够的大的空间,直接扩容,原空间数据不发生变化
若原有空间之后没有足够大的空间,在堆上另找一个合适大小的空间,并把原来的内容复制到新空间,释放原空间
d.free
free(ptr);
ptr=NULL;
函数功能:
说白了就一“擦屁股”的----用于释放内存
释放ptr指向的空间