游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

零基础学C语言知识总结十一动态内存分配

  动态内存分配(动态存储期)
  在程序执行并使用该变量的时候分配内存空间,使用完毕立即释放。
  动态内存分配就是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。动态内存分配不像数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小。
  当程序运行到需要一个动态分配的变量或对象时,必须向系统申请取得堆中的一块所需大小的存贮空间,用于存贮该变量或对象。当不再使用该变量或对象时,也就是它的生命结束时,要显式释放它所占用的存贮空间,这样系统就能对该堆空间进行再次分配,做到重复使用有限的资源。
  在使用数组的时候,总有一个问题困扰着我们:数组应该有多大?在很多的情况下,你并不能确定要使用多大的数组,比如上例,你可能并不知道我们要定义的这个数组到底有多大,那么你就要把数组定义得足够大。这样,你的程序在运行时就申请了固定大小的你认为足够大的内存空间。
  即使你知道你想利用的空间大小,但是如果因为某种特殊原因空间利用的大小有增加或者减少,你又必须重新去修改程序,扩大数组的存储范围。这种分配固定大小的内存分配方法称之为静态内存分配。但是这种内存分配的方法存在比较严重的缺陷,特别是处理某些问题时:在大多数情况下会浪费大量的内存空间,在少数情况下,当你定义的数组不够大时,可能引起下标越界错误,甚至导致严重后果。
  我们用动态内存分配就可以解决上面的问题。所谓动态内存分配就是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。动态内存分配不象数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小。
  从以上动、静态内存分配比较可以知道动态内存分配相对于静态内存分配的特点:
  1、不需要预先分配存储空间;
  2、分配的空间可以根据程序的需要扩大或缩小。
  常见的动态内存错误:
  (1)对NULL指针进行解引用操作
  (2)对分配的内存进行操作时越过边界
  (3)释放并非动态分配的内存
  (4)试图释放一块动态分配的内存的一部分以及一块内存被释放之后被继续使用。
  说明:
  1、动态分配最常见的错误就是忘记检查所请求的内存是否成功分配。
  2、动态内存分配的第二大错误来源是操作内存时超出了分配内存的边界。
  当你使用free时,可能出现各种不同的错误:
  1、传递给free的指针必须是一个从malloc、calloc或realloc函数返回的指针。
  2、传递给free函数一个指针,让它释放一块并非动态分配的内存可能导致程序立即终止或在晚些时候终止。
  3、试图释放一块动态分配内存的一部分也有可能引起类似问题。实例:动态内存分配实现可变长一维数组
  defineGRTSECURENOWARNNGS
  includestdio。h
  includestdlib。h
  includearray。h这个头文件里边包含一个结构表示数组和下列函数的声明原型
  constBlocksize20;一次增容20个存储空间
  Arrayarraycreat(intintssize);创建一个数组
  voidarrayfree(Arraya);回收空间
  intarraysize(constArraya);查看当前数组大小
  intarrayat(Arraya,intindex);访问数组
  voidarrayinlate(Arraya,intmoresize);增容
  intmain(void){
  Arraya;表示数组初始值的大小
  inti,j,n,m0;
  while(1){
  printf(请输入你需要多大的数组:);
  scanf(d,n);
  aarraycreat(n);这个可得到a里边返回的参数
  printf(输入数据);
  for(i0;in;i){
  scanf(d,j);
  arrayat(a,i)j;这个函数相当与是数组把j的值保存到数组里边的元素中去
  }
  printf(输出数据:);
  for(i0;in;i){遍历输出
  printf(d,a。arrray〔i〕);
  printf();
  }
  printf();
  printf(输入1初始化数组大小,输入其他表示退出程序:);
  scanf(d,n);
  if(n1){
  m0;清零
  j0;
  arrayfree(a);释放之前的内存
  }
  else{
  exit(0);退出程序
  }
  }
  return0;
  }
  Arrayarraycreat(intintssize)创建一个数组
  {
  Arraya;定义一个数组的结构体
  a。sizeintssize;表示数组的长度
  a。arrray(int)malloc(sizeof(int)a。size);前一个int是强制类型转换,后面的表示一个int是4个字节总共就是长度乘以
  returna;返回的作用是让主函数调用它时,能够得到它的参数
  }
  voidarrayfree(Arraya)回收空间
  {
  free(aarrray);
  aarrrayNULL;让指针指空不至于成为野指针
  asize0;
  }
  封装
  intarraysize(constArraya)查看当前数组大小
  {
  returnasize;
  }
  intarrayat(Arraya,intindex)访问数组
  {
  if(indexasize){
  下面的公式是为了算出Blocksize的底在哪
  比如130,如果直接加20要加两次,但是用公式就一次完成
  arrayinlate(a,(indexBlocksize1)Blocksizeasize);在原来的基础上加20个
  }
  返回指针加括号是为了保持优先级不出错
  return(aarrray〔index〕);如果返回的是值,那将不能被改变,返回指针就可以进行操作了
  }
  voidarrayinlate(Arraya,intmoresize)增容
  {
  intp(int)malloc(sizeof(int)(asizemoresize));重新申请一块更大的内存10020
  inti;
  for(i0;iasize;i){把之前数组的内容拷贝到新的数组中去
  p〔i〕aarrray〔i〕;
  }
  free(aarrray);把之前的数组释放
  aarrrayp;将指针改变指向重定向
  asizemoresize;大小加上新增的
  }
  程序演示:
  请输入你需要多大的数组:
  5hr输入数据
  12345
  输出数据:
  1hr2hr3hr4hr5hr输入1初始化数组大小,输入其他表述退出程序:
  1hr请输入你需要多大的数组:
  6hr输入数据
  123456
  输出数据:
  1hr2hr3hr4hr5hr6hr输入1初始化数组大小,输入其他表述退出程序:
  0hr进程1520已退出。返回代码为0。
  按任意键关闭此窗口。。。实例:动态内存分配实现可变长二维数组
  includestdio。h
  includemalloc。h
  intmain(void)
  {
  intn,m;
  scanf(dd,n,m);n5m2按照自己输入来确定二维数组的大小
  intp(int)malloc(sizeof(int)n);利用二级指针申请五行元素
  p是一个二级指针malloc函数返回一个int的类型sizeof(int)表示乘以的指针类型的大小
  、申请m个能够能够存放int类型的空间,并将首地址返回给一个二维指针p;
  内存可能的分布情况:
  intaint;intp;
  intbint;
  intcint;
  intdint;
  (int)一个表示强制类型转换,另一个表示指针int
  sizeof(int),不能少,一个指针的内存大小,每个元素是一个指针。用指针长度乘以数量(int)n
  这个p指针的数据类型是个二级指针,它指向的这个空间里放的是些一级指针
  for(inti0;i5;i)每行有两列元素
  {
  p〔i〕(int)malloc(sizeof(int)m);每个元素是int大小4m将元素保存到每一行
  每一个一级指针值的大小指向一个实际大小的空间
  (pi)p〔i〕每一次移动表示行的移动
  }
  赋值
  for(inti0;in;i)
  {
  for(intj0;jm;j)
  {
  p〔i〕〔j〕1;
  ((pi)j)p〔i〕〔j〕
  }
  }
  for(inti0;in;i)
  {
  for(intj0;jm;j)
  {
  输出数组每个元素值和地址
  printf(dp,p〔i〕〔j〕,p〔i〕〔j〕);
  }
  printf();
  }
  for(inti0;in;i){按行释放指针
  free(p〔i〕);
  }
  free(p);释放整体
  return0;
  }
  程序演示:
  52
  1010F44C01010F44C4
  1010F43781010F433C
  1010F43301010F4374
  1010FAB601010FAB64
  1010FAD981010FAB94
  进程8432已退出。返回代码为0。
  按任意键关闭此窗口。。。
  const函数(补充)
  之前一直把这个关键字漏掉了现在补上,const限定符,它把一个对象转换成一个常量,C语言中const关键字是constant的缩写,通常翻译为常量、常数等,有些朋友一看到const关键字马上就想到了常量。事实上在C语言中const功能很强大,它可以修饰变量、数组、指针、函数参数等。
  1、修饰变量:
  在程序中使用const修饰变量,就可以对变量声明为只读特性,并保护变量值以防被修改。如下:
  constinti5;变量i具有只读特性,不能够被更改;若想对i重新赋值,如i10;则是错误的。
  值得注意的是,定义变量的同时,必须初始化。定义形式也可以写成intconsti5,同样正确。
  此外,const修饰变量还起到了节约空间的目的,通常编译器并不给普通const只读变量分配空间,而是将它们保存到符号表中,无需读写内存操作,程序执行效率也会提高。
  2、修饰数组
  C语言中const还可以修饰数组,举例如下:
  constintarray〔5〕{1,2,3,4,5};
  array〔0〕array〔0〕1;错误
  数组元素与变量类似,具有只读属性,不能被更改;一旦更改,如程序将会报错。
  3、修饰函数参数
  const关键字修饰函数参数,对参数起限定作用,防止其在函数内部被修改。所限定的函数参数可以是普通变量,也可以是指针变量。举例如下:
  voidfun1(constinti)
  i;对i的值进行了修改,程序报错
  voidfun2(constintp)
  (p);对p指向空间的值进行了修改,程序报错
  保护数组中的元素:
  为了避免函数的意图不是为了修改数组当中的数据内容,那么在函数原始声明定义中时应使用关键字const,如:
  intsum(consta〔〕,intn);这段代码告诉编译器,该函数不能修改a所指向的数组中的内容,如果在函数中不小心使用类似a〔i〕;的表达式,那么程序将会报错。
  要注意的是,这样使用const并不是要求原数组是常量,而是该函数在处理数组时将其视为常量,不可修改,这样使用const可以保护数组当中的数据不被修改。
  4、修饰指针
  C语言中const修饰指针要特别注意,共有两种形式,一种是用来限定指向空间的值不能修改;另一种是限定指针不可更改。举例说明如下:
  inti5;
  intj6;
  intk7;
  constintp1i;定义1
  intconstp2j;定义2
  上面定义了两个指针p1和p2。
  在定义1中const限定的是p1,即其指向空间的值不可改变,若改变其指向空间的值如p120,则程序会报错;但p1的值是可以改变的,对p1重新赋值如p1k是没有任何问题的。
  在定义2中const限定的是指针p2,若改变p2的值如p2k,程序将会报错;但p2,即其所指向空间的值可以改变,如p280是没有问题的,程序正常执行。
  关于指针赋值和const需要注意一些规则:
  1、把const数据或非const数据的地址初始化为指向const的指针或为其赋值是合法的
  2、可以声明并初始化一个不能指向别处的指针,关键是const的位置,这时候,这个指针可以修改它所指向的值,但是只能指向初始化时设置的地址。
  3、在创建指针时还可以使用两次const,表示该指针既不能修改它所指向的地址,也不能修改它所指向地址上的值
  清单:inta〔10〕;
  constdoubleb〔10〕;
  constdoublepa;有效
  pb;有效
  pa〔3〕;有效
  inta〔10〕;
  constdoubleb〔10〕;
  只能将非const数据的地址赋给普通指针(否则,通过指针就能修改const数组中的值了)
  doublepa有效
  pb;无效
  pa〔3〕;有效
  voidsum(constdoublea,intn);
  此函数可以接受普通数组和const数组名作为参数,因为这两种参数都可以用来初始化指向const的指针
  inta〔10〕;
  constdoubleb〔10〕;
  sum(a,5);合法
  sum(b,4);合法
  inta〔10〕;
  doubleconstpa;p指向数组的开始
  pa〔0〕;不允许,因为该指针不能指向别处
  p9。9;可以做,更改a〔0〕的值
  inta〔10〕;
  constdoubleconstpa;
  pa〔0〕;不允许
  p9。9;不允许
  块
  块指的是一块数据,是个抽象的概念,和C语言没有关系,这种抽象的东西,别说其他语言也能用,就是日常生活中也会把东西分块管理,C语言中没有对块进行定义,因为这只是个抽象的概念,块可以是内存块,数据块,程序块,哪怕是豆腐块也能是块。。。意思就是在管理中被划分为一类的一个基本单位
  存储期:
  存储期这也是变量的特点,它称为生存期,表示变量在内存中存在的时间的长短。
  1、静态存储期:在程序编译时就分配内存空间并保持不变,程序执行结束后才释放。
  2、线程存储期:threadlocal,其声明后会给每个线程分配一个单独的私有备份
  3、自动存储期:局部变量通常都自动为auto存储期
  4、动态存储期:就是用new或者malloc分配的内存,如果不主动释放,在整个程序都占有内存
  作用域:
  这个是表示变量在哪些范围内起作用,由链接点决定。
  1、块作用域:用{}括起来的,从声明开始到}结束
  2、函数作用域:goto(标识符)的作用域为整个函数。
  3、函数原型作用域:函数声明开始,函数声明结束而结束
  4、文件作用域:整个文件或者程序
  链接属性:表示变量能在哪些范围内使用。
  1、内部链接:只能在源文件内部使用。
  2、外部链接:能在源文件内部和外部文件中使用。
  3、空连接:只能在代码块内(函数内部)使用。
  限定符:
  volatile:
  const:
  restrict:
  Atomic:
  作者:MrLi
  另外的话为了帮助大家,轻松,高效学习C语言C,我给大家分享我收集的资源,从最零基础开始的教程到C语言项目案例,帮助大家在学习C语言的道路上披荆斩棘!可以来我粉丝群领取哦
  编程学习书籍分享:
  编程学习视频分享:
  整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程)最重要的是你可以在群里面交流提问编程问题哦!
  对于CC感兴趣可以关注小编在后台私信我:【编程交流】一起来学习哦!可以领取一些CC的项目学习视频资料哦!已经设置好了关键词自动回复,自动领取就好了!

旗舰绿厂发哥你会支持吗?FindX6系列天玑9200骁龙8G2022年高通摆烂天玑发力,不少厂商发布了搭载一代神U天玑8100的手机,同时也有几款搭载天玑9000系列的旗舰机型,但要说调校和优化,蓝厂给用户印象最深,而OPPOFindX……17岁少女自由行遭西藏民宿老板性侵,旅行别忘了注意以下几点头条创作挑战赛近日,有网友在朋友圈里自曝自己在西藏旅行的时候遭到民宿老板性侵,并且说明已经报案,由于自己未满十八岁,因此定性为强奸。自从疫情放开之后,很多人都因为压……张嘉倪现身街头疑醉酒!全程摇摇晃晃走不稳,穿露脐装大秀腰肢近日,有媒体拍到疑似张嘉倪深夜街边醉酒的画面,当天张嘉倪一头粉色头发,穿着超级宽松的西装外套,低调之余又透出了一丝辣妹氛围感,属实让人看不出她今年已经35岁了。当天张嘉倪……杨幂跟张大大一起过年,两人身穿情侣装,亲密自拍不避嫌2月1号,张大大晒出虎年第一条微博,祝大家新年快乐!张大大晒出10多张照片,满屏的新年氛围,最先po出的是他跟杨幂宋祖儿的自拍照,只见张大大跟杨幂都穿着红格子衬衣,内搭白……新赛季令人瞠目结舌的六大球星,班切罗一鸣惊人,史密斯名不副实祸兮福所倚,福兮祸所伏。这句出自老子道德经的经典语录同样适用于NBA舞台。在变化莫测的舞台上,从来没有一成不变的事物。从跟腱断裂重返巅峰的杜兰特,再到从三双王沦为饮水机管理员的……JasminWalia现身街头,身穿运动套装高挑有型,长发披近日,女星贾丝明瓦利亚(JasminWalia)现身街头,当天,她身穿一套运动装外出,显得很高挑有型,她的长发披肩,戴着一副墨镜,看起来很有魅力。她是一名歌手,也是女演员,也有……中国造无人驾驶单轨列车在泰国跑起来新华国际2022世界制造业大会于9月20日至23日在安徽省合肥市召开,众多高端装备和技术精彩亮相。展馆内,一列搭载多项先进技术和工艺的无人驾驶跨座式单轨列车吸引了不少观众……文旅快讯丨湖湘书法经典新书首发上海乐高乐园配套项目开工1、文旅部:旅行社需对旅游产品进行安全风险评估文旅部印发《旅行社新肺炎疫情防控工作指南(第五版)》提出,旅行社要对旅游产品进行安全风险评估,选择具有相应资质目符合当地疫情……5款8100芯片手机,功耗低性能强,最低仅1699元,还能再您在阅读前请点击上面的关注二字,后续会第一时间为您提供更多有价值的相关内容,感谢您的支持。因为高通骁龙888与骁龙8Gen1处理器功耗大,发热量高的原因,天玑8100芯片……王者荣耀坦克英雄很肉?反制他们的英雄来咯哈喽,大家好!我是又菜又爱玩的悠闲橘子Do。在王者荣耀中,坦克英雄时常会成为一场比赛中的核心角色,他们拥有高生命值和防御力,让对手难以对他们造成有效的伤害。然而,一些英雄……经典的八五式军装之男干部长袖衬衣85干部长袖衬衣八五式军装可以说是我军历史上装备时间最短的一款军装,从装备到换装仅3年多时间,但也为恢复军衔制打下了良好基础。随着国家经济形势的发展,八五式军装相比较六五……不吃晚饭的好处与坏处不吃晚饭可能对身体有好处,也可能有坏处,具体取决于个人情况和生活习惯。好处:控制体重:不吃晚饭可以减少摄入的热量,有助于控制体重。促进消化:晚餐吃得太晚或太饱……
外媒上手苹果iPhone12Pro真机蓝色亮眼IT之家10月15日消息苹果昨天凌晨正式发布了iPhone12系列新机,目前新机还未开售。不过,苹果公司将iPhone12和iPhone12Pro发给了ABC新闻科技记者Bec……爆料苹果iPhone12Pro发布后,iPhone11XRSIT之家10月12日消息苹果此前已经宣布将在北京时间10月14日凌晨1点举行新品发布会,预计将带来iPhone12系列新品,包括iPhone12mini、iPhone12、iP……消息称苹果iPhone12ProMax将采用SensorShIT之家10月12日消息据《科创板日报》报道,从供应链独家获悉,iPhone12系列新机中的高配版主摄,将采用SensorShift技术,以取代目前的OIS光学防抖技术。这项技……爆料苹果iPhone12系列将具有更快的FaceID改进的变IT之家10月12日消息爆料人士MaxWeinbach今天通过他的Twitter账号PineLeaks分享了关于即将到来的iPhone12的最终确定和修改的新信息。Wei……深度解读对华为的三种质疑越来越强烈,华为还值得国人支持吗?在网上看到这么个问题,想展开写一写:在华为王者回归这件事上,为什么感觉支持国产这个口号喊不动了?这个问题本身其实不太严谨,首先华为并没有上演王者归来的情节,事实上华为目前……大摩新款iPhone将推动苹果股票在2021年跑赢大盘摩根士丹利表示,下周苹果公司的新品发布会将推动这家科技巨头的股票继续上涨。摩根士丹利将苹果公司2021年营收和收益预期提高了2,比市场普遍预期高出5至6,因其将下周iPh……苹果iOS14安装率接近50,即将超过iOS13IT之家10月28日消息推出五周多后,根据Mixpanel的iOS14追踪器获得的数据,iOS14采用率即将超过iOS13,成为iOS系统安装量最大的版本。苹果还没有分享……因销售火爆,苹果iPhone12加单200万部IT之家10月27日消息据上海证券报消息,从iPhone产业链人士透露:由于销售火爆,苹果iPhone12加单200万部,并且看好苹果各产品线明年的出货量。由于这一代iP……供应链苹果推出全新磁吸配件认证标志MadeforMagSafIT之家10月27日消息根据充电头网的报道,供应链称苹果已经推出全新的配件认证生态链MadeforMagSafe(MFM),涉及磁吸类的保护套、车充、卡包,以及未来的磁吸配件等……在老人心里,孙子和外孙有区别吗?爷孙俩的对话暗含本质文忒咪妈妈(原创文章,欢迎个人分享转发)想先问问大家:在你眼里,孙子和外孙有区别吗?可能面对这个问题,绝大多数人都会义正严词地说,现在都什么年代了,还能分得这么清楚……GoogleFi用户暂不能使用iPhone12Pro5G功能IT之家10月27日消息外媒9to5Google报道,iPhone12和iPhone12Pro在上周五发售时,5G被宣传为旗舰功能,但GoogleFi套餐客户目前还不能使用这种……科技助力河西走廊新能源稳定发展三月春风强劲,甘肃河西走廊风光资源日益丰富,源源不断的绿电通过新能源煤电特高压模式外送。5G巡检机器人、三维可视化监测、大数据算法优化煤炉运行等技术助力河西走廊火电调峰企业与风……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网