1.为什么会有动态内存分配
对于静态定义的数组变量,长度大小是固定的,代码灵活小很低
而动态分配内存,你想要多少空间,就分配多少空间,想扩容多少空间,就扩容多少空间
无论是对于代码灵活性还是自己的主观臆断性都有了很好改观
动态开辟空间函数
头文件:#include<stdlib.h>
(1)malloc
-
void* malloc(size_t num) (size_t)无符号类型整数
-
这个函数向内存申请一块连续可用的空间,并返回指向这块内存空间
-
地址如果开辟成功,则返回开辟好空间的地址,如果开辟失败,则返回NULL,因此malloc的返回值一定要检查,不然很容易报空指针错误
-
由于函数的返回值是vod*,所以在使用的时候需要自己决定使用什么类型,然后强制转换
-
如果num为0,malloc的标准行为是没有定义的,取决于编译器
成功开辟:
开辟失败
可以看出,如果是整型指针动态分配内存的话,其本质可以看作一个整型数组
整型指针malloc开辟空间后,如果没有初始化里面的值,空间里的值是随机的(0Xcdcdcdcd)
(2)calloc
-
void* calloc(size_t num,size_t size);
-
开辟一块大小为num,数量为size的空间,并将地址的每个空间的字节初始化为0
与malloc的区别只在于malloc会将开辟好的每个空间的字节初始化为0
(3)realloc
- void* realloc(void* ptr,size_t size) ptr是需要调整的地址,size是调整的大小,单位是字节返回值,是内存的起始位置
- realooc可以让我们的空间管理的更加灵活
- 当我们发现空间调大或者调小了的时候,可以使用realloc函数对空间对其调整
realloc追加空间时,有两种情况:
- 当内存空间足够大时,返回空间的起始地址
- 当内存空间不足时,realloc会找一块更大的空间,并且原来地址上的数据全部复制过来,返回新空间的地址值
很明显可以看出,调整后的两处空间值不一样
这么写代码是存在很大隐患的,当realloc开辟失败后,会返回空指针,那么p以前的空间地址存储的数据都没了
正确的写法应该是创建一个临时变量先接收调整后的地址值,再判断是否为空,不为空便赋值给原地址
当指针变量为空时,realloc的作用与malloc的作用一样
(4)free
任何用动态开辟的空间,在程序使用时一定要使用free()函数进行内存释放,不然 会造成内存泄漏
小结:
动态开辟内存可以让我们更加灵活地使用内存空间,完成较灵活的代码,但其中也要注重很多细节,比如开辟空间后空指针的判断,或是开辟空间后是否使用free函数进行内存释放。故有更好方法的同时,也一定要注重其实现细节