当前位置: 首页 > wzjs >正文

技术支持 昆明网站建设营销型制作网站公司

技术支持 昆明网站建设,营销型制作网站公司,wordpress菜单icon,网站模块设计软件为什么要有动态内存分配我们在学习动态内存管理之前,一直都是通过开辟变量,或者是开辟数组的方式来在内存的栈区开辟空间的,但是这样的开辟方式有局限性,因为一旦开辟之后,它们的大小就无法改变,就缺少了很…

为什么要有动态内存分配

        我们在学习动态内存管理之前,一直都是通过开辟变量,或者是开辟数组的方式来在内存的栈区开辟空间的,但是这样的开辟方式有局限性,因为一旦开辟之后,它们的大小就无法改变,就缺少了很多的灵活性,但是动态内存管理就可以帮助我们解决这个问题,它是在堆区开辟空间的,并且它所开辟的空间是可大可小的。

动态内存开辟四大函数

        其实想要动态开辟内存空间非常的简单,我们只需要学会内存开辟四大函数就可以了。

        malloc和free

        malloc函数就是用来在内存的堆区开辟空间的,它的函数定义如下。

   void* malloc (size_t size);

   函数的形参表示所要开辟空间的字节大小,你想要开辟几个字节的空间,就给形参什么值,malloc函数是在堆区开辟的一块连续的空间,一旦开辟了空间,我们想要找到这块空间,就势必要只要它的起始地址值,而malloc函数的返回值就是这个作用,它返回的是开辟空间的起始地址,那为什么是void*类型的指针呢?原因就是我在开辟的时候,我也不知道要往这块空间里边存放什么类型的数据,或者说什么类型的数据都可以存放在我这块空间里边,所以一开始就给它返回的是void*类型的指针。还有一个值得注意的点就是malloc开辟空间如果失败的话,就会返回NULL值,所以我们需要对返回值进行判断。

        malloc函数的使用举例

#include<stdio.h>
#include<stdlib.h>//四大内存开辟函数都需要包含这个头文件int main()
{//假设现在我想要开辟40个字节的空间,并且像里边存放整型数据int* pi = (int*)malloc(40);//判断是否开辟成功//为NULL就代表开辟空间失败,perror打印开辟失败的原因//返回非0的值,C语言里边返回非0的值表示异常结束if (pi == NULL){perror("malloc");return 1;}//开辟成功,可以向这块空间里边存值for (int i = 0; i < 10; i++){*(pi + i) = i + 1;//存入1~10的值}//打印for (int i = 0; i < 10; i++){printf("%d ", *(pi + i));}return 0;
}

        由上边的代码跟运行结果来看,好像似乎并没有什么问题,但malloc毕竟是动态开辟的空间,开辟了空间难道就不用回收的吗?答案是要回收的,上边的代码好像并没有回收,那怎么也可以运行呢,原因是当程序结束的时候,操作系统会自动帮你回收,不过如果日后的代码过长,或者是程序是一个7*24小时不停歇的运转的话,如果我们不主动回收,就会出现内存泄露的问题,所以如果这块动态开辟的内存你不再想要使用的时候,就请主动回收掉,free函数就是用来主动回收的。

        free:

   它的函数定义如下

   void free (void* ptr);

   它的形参的指针就指向的是动态开辟的起始地址的位置,如果给它传NULL,那么这个函数将什么都不会做。

   接下来我们对刚才的代码做一个完善   

        由图可见,释放代码其实就两行,但是至关重要。

        大家可能会有疑惑,释放完了空间之后,为什么还要将pi赋值为NULL指针,原因是因为刚才的pi指针接收了malloc动态开辟的空间,但是当free之后,刚才申请的那块空间已经被释放了,里边的数据也已经不是刚才存进去的数据了,而此时pi指针里边仍存放着那块空间的地址,这就形成了野指针,所以给它赋值为NULL。

        calloc和realloc

        calloc函数也是用来动态内存开辟空间的函数,它的函数定义如下

   void* calloc (size_t num,size_t size);

   函数的形参的意思就是为num个大小为size的元素开辟空间,并且calloc函数会把开辟的空间的每个字节都初始化为0。

        calloc函数的使用举例

#include<stdio.h>
#include<stdlib.h>
int main()
{//给10个大小为int类型的数据开辟空间//用malloc函数就相当于//malloc(10 * sizeof(int));int* pi = (int*)calloc(10, sizeof(int));if (pi == NULL){perror("calloc");return 1;}//开辟成功,使用//calloc会自动的给申请的空间初始化为0for (int i = 0; i < 10; i++){printf("%d ", *(pi + i));}//释放free(pi);pi = NULL;return 0;
}

        realloc函数是用来对我们动态申请的内存进行调整的。它的函数定义如下。

   void* realloc (void* ptr , size_t size);

   ptr是要调整空间内存的起始地址。size为调整之后的新大小。返回值为调整后的内存的起始位置。

        对于realloc函数的重新调整空间大小,总共有三种情况。

        情况1:原有空间之后有足够的空间。

        情况2:原有的空间之后没有足够的空间。

        情况3:重新调整空间失败,返回NULL指针。

        realloc函数的使用举例

#include<stdio.h>
#include<stdlib.h>
int main()
{//申请空间int* pi = (int*)malloc(40);if (pi == NULL){perror("malloc");return 1;}//使用空间for (int i = 0; i < 10; i++){*(pi + i) = i++;}for (int i = 0; i < 10; i++){printf("%d ", *(pi + i));}//内存不够,重新调整//注意,这个返回值不能用刚才的pi来接收,因为可能开辟空间失败返回NULL,这样就导致原来开辟的空间也找不到了。int* ptr = (int*)realloc(pi, 80);if (ptr == NULL){perror("realloc");return 1;}else//开辟成功{pi = ptr;ptr = NULL;}//继续使用........//释放空间free(pi);pi = NULL;return 0;
}
http://www.dtcms.com/wzjs/512940.html

相关文章:

  • 做视频网站需要多大的带宽贵州二级站seo整站优化排名
  • b2c网站举例武汉网站提升排名
  • 做衣服网站代运营
  • 网站建设前台后台教程网络媒体推广报价
  • 网站建设马鞍山seo建站技术
  • 国外档案网站建设培训机构咨询
  • 网站建设案例资料seo自动优化软件
  • 网站到期忘记续费上海seo优化服务公司
  • 做网站需要准备哪些材料品牌推广活动有哪些
  • 一个人做网站的swot兰州百度推广的公司
  • 网站策划的步骤网站检测
  • 网站数据比较关键字排名查询
  • 织梦网站首页打开慢网页模板图片
  • 特色的南昌网站制作电商平台排行榜
  • 长白山开发建设集团网站网站推广怎么做有效果
  • 做网站郴州长沙做搜索引擎的公司
  • 江山企业自适应网站建设首选买友情链接
  • 网站分享平台无锡网络优化推广公司
  • 国外网站怎么做推广国外网站排行
  • 余姚响应式网站建设搜狗搜索引擎优化论文
  • 山东住房与城乡建设网站福建网站建设制作
  • 网站开发的软件环境搜索推广和信息流推广的区别
  • 国家企业信息公示网官网(中国)百度seo优化排名软件
  • 中企动力是什么公司杭州网站推广优化
  • 自己制作wordpress子主题德阳seo优化
  • 人才网站建设经费用途艾滋病多久能查出来
  • 水碓子网站建设免费创建个人网站
  • 找权重高的网站方法google网址直接打开
  • wordpress储存南昌seo全网营销
  • 免费发布推广信息株洲企业seo优化