Hello,各位小伙伴们,小编在这里祝福各位中秋佳节快乐呀,今天让我们来学习一下动态内存管理吧!
引言
像我们之前在开辟一段空间的时候你可能会使用整型变量来申请一块空间,或者使用数组来申请一段连续的空间,但它们的空间大小都是在创建变量的时候确定的!难免会造成空间的浪费或者超出空间大小。为了解决这一问题,设计了动态内存管理。
动态内存管理大大提高的空间的灵活度但也出现了一些新的问题:越是灵活越容易出错!
让我们来学习一下这四种函数吧!
1-->malloc
void*malloc(size_t size);
在进行动态内存开辟的时候,如果开辟成功就会返回一个开辟好空间的指针。如果开辟失败将会返回空指针!
例如:
#include<stdio.h>
int main ()
{int *a = (int*)malloc(40);if(a==NULL){perror("malloc");return 1;//出现错误返回}int i = 0;for(i = 0;i < 10;i++){*(p+i) = i+1;}for(i = 0;i < 10;i++){printf("%d ",*(p+i));}free(a);a = NULL;return 0;
}
要增加一个判断语句来判断a是否为空指针!
2-->free
malloc是用来申请空间的,但申请之后要及时释放!free函数就是专门为malloc来释放空间的。在释放之后,p指向的地址还给操作系统,但源地址仍然可以找到,但p不能在使用了。这样就会1造成空指针,所以在释放之后要对原来的指针变量设为空指针!
但值得注意的是,free所释放的空间必须是动态内存空间不能对非动态内存进行释放!
3--> calloc
calloc也是用来开辟空间的,与malloc有相同的地方。
void*calloc(size_t num , size_t size);
calloc所指向的num为某种类型的个数,size为该类型的大小。
如果要申请5个整型大小的空间
#include<stdio.h>
int main ()
{int *p = (int*)calloc(5 , sizeof(int));if(p ==NULL){perror("calloc");return 1;}int i = 0;for(i = 0;i < 5;i++){*(p+i) = i+1;}free(p);p = NULL;return 0;
}
与malloc不同的是calloc在申请空间的时候会对所申请的空间进行初始化处理,初始化为0。
而malloc不会对所申请的空间进行初始化处理!
4-->realloc
realloc是让动态管理内存更加灵活,有时会我们发现过去申请的空间太小了,有时候我们又会觉得申请的空间过大了,那为了合理的使用内存,我们一定会对内存的大小做灵活的调整。那 realloc 函数就可以做到对动态开辟内存大小的调整。
void *realloc(void*ptr , size_t size );
ptr是要调整的地址,size是调整后地址的大小。
同时realloc的调整方式有两种:1、如果后面内存空间足够大,直接在原来的基础上增加内存空间大小
2、如果后面内存空间不够大,则会重新找一块能够满足空间大小的内存,将原来的内容先拷贝进去,然后在后面进行调整。
让我们来看看如何具体使用:
#include<stdio.h>
#include<stdlib.h>
int main()
{int* p = (int*)malloc(20);if (p == NULL){perror("malloc");return 1;}//使用int i = 0;for (i = 0; i < 5; i++){*(p + i) = 1 + i;}int*ptr = (int*)realloc(p, 40);//增加5个整型if (ptr != NULL){p = ptr;}else{perror("realloc");return 1;}for (i = 5; i < 10; i++){*(p + i) = 1 + i;}for (i = 0; i < 10; i++){printf("%d ", *(p + i));}free(p);p = NULL;return 0;
}
同时realloc可以实现malloc的功能,将ptr传递空指针就可以啦。
#include<stdio.h>
#include<stdlib.h>
int main ()
{int *p = (int *)realloc(NULL,40);if(p==NULL){perror("realloc");return 1;}int i = 0;for(i = 0;i < 10 ;i++){*(p+i) = i+1;}for(i = 0;i < 10;i++){printf("%d ",*(p+i));}free(p);p = NULL;return 0;
}
OK,今天的内容就到这里啦!祝各位小伙伴们好时节,愿得年年,常见中秋!