优速网站建设优化seo,响应式网站开发视频教程,查询网站收录,如何彻底清除网站的网页木马Hello#xff0c;各位小伙伴们#xff0c;小编在这里祝福各位中秋佳节快乐呀#xff0c;今天让我们来学习一下动态内存管理吧#xff01;
引言
像我们之前在开辟一段空间的时候你可能会使用整型变量来申请一块空间#xff0c;或者使用数组来申请一段连续的空间#xff…Hello各位小伙伴们小编在这里祝福各位中秋佳节快乐呀今天让我们来学习一下动态内存管理吧
引言
像我们之前在开辟一段空间的时候你可能会使用整型变量来申请一块空间或者使用数组来申请一段连续的空间但它们的空间大小都是在创建变量的时候确定的难免会造成空间的浪费或者超出空间大小。为了解决这一问题设计了动态内存管理。
动态内存管理大大提高的空间的灵活度但也出现了一些新的问题越是灵活越容易出错
让我们来学习一下这四种函数吧
1--malloc
void*malloc(size_t size);
在进行动态内存开辟的时候如果开辟成功就会返回一个开辟好空间的指针。如果开辟失败将会返回空指针
例如
#includestdio.h
int main ()
{int *a (int*)malloc(40);if(aNULL){perror(malloc);return 1;//出现错误返回}int i 0;for(i 0;i 10;i){*(pi) i1;}for(i 0;i 10;i){printf(%d ,*(pi));}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个整型大小的空间
#includestdio.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){*(pi) i1;}free(p);p NULL;return 0;
} 与malloc不同的是calloc在申请空间的时候会对所申请的空间进行初始化处理初始化为0。
而malloc不会对所申请的空间进行初始化处理 malloc的调试图 calloc的调试图 4--realloc
realloc是让动态管理内存更加灵活有时会我们发现过去申请的空间太小了有时候我们又会觉得申请的空间过大了那为了合理的使用内存我们一定会对内存的大小做灵活的调整。那 realloc 函数就可以做到对动态开辟内存大小的调整。
void *realloc(void*ptr , size_t size );
ptr是要调整的地址size是调整后地址的大小。
同时realloc的调整方式有两种1、如果后面内存空间足够大直接在原来的基础上增加内存空间大小
2、如果后面内存空间不够大则会重新找一块能够满足空间大小的内存将原来的内容先拷贝进去然后在后面进行调整。 第二种情况 让我们来看看如何具体使用
#includestdio.h
#includestdlib.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传递空指针就可以啦。
#includestdio.h
#includestdlib.h
int main ()
{int *p (int *)realloc(NULL,40);if(pNULL){perror(realloc);return 1;}int i 0;for(i 0;i 10 ;i){*(pi) i1;}for(i 0;i 10;i){printf(%d ,*(pi));}free(p);p NULL;return 0;
}
OK今天的内容就到这里啦祝各位小伙伴们好时节愿得年年常见中秋