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函数进行内存释放。故有更好方法的同时,也一定要注重其实现细节
动态内存分配提供比静态数组更高的灵活性,允许在运行时按需分配和调整内存。malloc用于分配指定大小的内存块,calloc一次性分配并初始化为0,realloc可调整已分配内存的大小,而free用于释放不再需要的内存,防止内存泄漏。使用这些函数时需要注意空指针检查和内存管理细节。
1048

被折叠的 条评论
为什么被折叠?



