赞
踩
我们已经掌握的内存开辟方式有:
int val = 20;//在栈空间上开辟四个字节
char arr[10] = {
0};//在栈空间上开辟10个字节的连续空间
但是上述的开辟空间的方式有两个特点:
但是对于空间的需求,不仅仅是上述的情况。有时候我们需要的空间大小在程序运行的时候才能知道,有时候我们需要内存空间扩大或者缩小,这时候我们只能使用动态内存开辟了
比如说,之前我写的通讯录一次开辟了1000个数据空间,但我可能只需要3个人,所以其他的空间就会浪费,我们要是能随时改变开辟空间的大小,就可以让空间不再浪费,而我们开辟的动态内存,是在堆区上进行的
void* malloc (size_t size);
头文件:<stdlib.h> 或<malloc.h>
功能:这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针
1.如果开辟成功,则返回一个指向开辟好空间的指针。
2.如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。
这里利用INT_MAX值超大的特性,向系统申请开辟一块超大的内存,系统发现没有这么大的空余空间,就会开辟失败,返回NULL
3.返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己来决定。
4.如果参数 size 为0,malloc的行为是标准是未定义的,取决于编译器。
size为0,可以返回地址,但是地址不能解引用去使用,即使编译器可以去使用,也不要去使用,因为该地址中的内存空间为0,你去使用会出现非法访问的问题
void free (void* ptr);
头文件:<stdlib.h> 或 <malloc.h>
功能:free函数用来释放动态开辟的内存
1.如果参数 ptr 指向的空间不是动态开辟的,那free函数的行为是未定义的。
free经常配合malloc去使用,当malloc开辟玩内存并进行完操作后,就要去释放开辟的动态内存
2.如果参数 ptr 是NULL指针,则函数什么事都不做。
3.如果我们不释放动态内存申请的内存的时候,如果程序结束,动态申请的内存由操作系统回收,如果程序不结束,动态内存是不会自动回收的,就会造成内存泄漏
假如我们有一个程序7*24小时跑在服务器里,如果有程序会慢慢吃内存,内存早晚会被侵蚀完,早晚会被泄漏完,到时候服务器里没有内存可用,服务器就会崩掉
void* calloc (size_t num, size_t size);
头文件:<stdlib.h> 或<malloc.h>
功能:这个函数向内存申请 num 个大小为 size 的元素个内存空间,并且把空间的每个字节初始化为0,返回指向这块空间的指针
1.函数的功能是为 num 个大小为 size 的元素开辟一块空间,并且把空间的每个字节初始化为0。
与函数 malloc 的区别只在于 calloc 会在返回地址之前把申请的空间的每个字节初始化为全0。
所以如何我们对申请的内存空间的内容要求初始化,那么可以很方便的使用calloc函数来完成任务。
void* realloc (void* ptr, size_t size);
头文件:<stdlib.h> 或<malloc.h>
功能:增加或减少内存空间原有的大小,使内存管理更加灵活
realloc函数的出现让动态内存管理更加灵活有时会我们发现过去申请的空间太小了,有时候我们又会觉得申请的空间过大了,那为了合理的时候内存,我们一定会对内存的大小做灵活的调整。那 realloc 函数就可以做到对动态开辟内存大小的调整。
ptr 是要调整的内存地址
size 调整之后新大小,也就是整块内存增加后的总大小
返回值为调整之后的内存起始位置。
这个函数调整原内存空间大小的基础上,还会将原来内存中的数据移动到新的空间
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。