专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

C语言结构体成员赋值的深拷贝与浅拷贝

  文章下方附学习资源,自助领取
  最近在做通信协议的解析处理、传递分析的时候,总是遇到通信帧中的结构体拷贝等问题,而这些问题也是比较基础又易错的C语言知识。今天,我们探究一下结构体的深拷贝和浅拷贝。浅拷贝
  C语言中的浅拷贝是指在拷贝过程中,对于指针型成员变量只拷贝指针本身,而不拷贝指针所指向的目标,它按字节复制的。
  接下来,我们分几种情况举例来看一下。1、结构体中不存在指针成员变量时
  代码如下:在win1064位vs2017来源:技术让梦想更伟大作者:李肖遥includestdio。htypedefstruct{charname〔64〕;intage;}Member;intmain(){Memberstu1{LiMing,18};Memberstu2;stu2stu1;printf(s,d,stu2。name,stu2。age);system(pause);return0;}
  运行如下:
  点击获取1V1嵌入式学习规划,现在还送100G精选学习资料。鍜瀛範宓屽叆寮忕墿鑱旂綉寮鍙
  2、结构体中存在指针成员变量时
  代码如下:在win1064位vs2017来源:技术让梦想更伟大作者:李肖遥includestdio。hincludestdlib。hincludestring。htypedefstruct{charname;intage;}Member;intmain(){MemberMember1,Member2;Member1。namemalloc(sizeof(char)64);if(NULLMember1。name){printf(mallocfailed);}memset(Member1。name,0,64);strcpy(Member1。name,LiMing);snprintf(Member1。name,64,LiMing);Member1。age18;Member2Member1;拷贝snprintf(Member2。name,64,LiXiaoYao);Member2。age29;printf(s,d,Member1。name,Member1。age);if(NULL!Member1。name){free(Member1。name);Member1。nameNULL;}system(pause);return0;}
  运行如下:
  从中我们看到,改变Member2的值,Member1的值也改变了,这说明一片空间被两个不同的子对象共享了,改变一个对象的值另外一个也会随之改变。
  我们改变Member2写法,申请内存的代码如下:在win1064位vs2017来源:技术让梦想更伟大作者:李肖遥includestdio。hincludestdlib。hincludestring。htypedefstruct{charname;intage;}Member;intmain(){MemberMember1;Member1。namemalloc(sizeof(char)64);if(NULLMember1。name){printf(mallocfailed);}memset(Member1。name,0,64);strcpy(Member1。name,LiMing);snprintf(Member1。name,64,LiMing);Member1。age18;MemberMember2;Member2。namemalloc(sizeof(char)64);if(NULLMember2。name){printf(mallocfailed);}memset(Member2。name,0,64);strcpy(Member2。name,LiMing);snprintf(Member2。name,64,LiXiaoYao);Member2。age29;Member1Member2;printf(s,d,Member2。name,Member2。age);if(NULL!Member1。name){free(Member1。name);Member1。nameNULL;}if(NULL!Member2。name){free(Member2。name);Member2。nameNULL;}system(pause);return0;}
  运行如下:
  从中我们看到,当数据成员中有指针时,两个类中的两个指针将指向同一个地址,当对象快结束时,会调用两次free函数,此时Member2已经是野指针(图中有X的错误标志),这个野指针指向的内存空间已经被释放掉,再次释放会报异常错误,要解决这个问题就要涉及到深拷贝了。深拷贝
  深拷贝除了拷贝其成员本身的值之外,还拷贝成员指向的动态内存区域内容,深拷贝会在堆内存中另外申请空间来储存数据。
  解决的思路是在释放掉被赋值指针变量的旧指向内存时,重新对其开辟新内存,这种情况下两个结构体中指针地址不同,但是指向的内容是一致的。
  代码如下:在win1064位vs2017来源:技术让梦想更伟大作者:李肖遥includestdio。hincludestdlib。htypedefstruct{charname;intage;}Member;intmain(){MemberMember1;Member1。namemalloc(sizeof(char)64);if(NULLMember1。name){printf(mallocfailed);}memset(Member1。name,0,64);strcpy(Member1。name,LiMing);snprintf(Member1。name,64,LiMing);Member1。age18;MemberMember2;Member2。namemalloc(sizeof(char)64);if(NULLMember2。name){printf(mallocfailed);}memset(Member2。name,0,64);strcpy(Member2。name,LiMing);snprintf(Member2。name,64,LiXiaoYao);Member2。age29;if(Member1。name!NULL){free(Member1。name);Member1。nameNULL;}Member1。namemalloc(strlen(Member2。name)1);strcpy(Member1。name,Member2。name);printf(s,d,Member1。name,Member1。age);if(NULL!Member1。name){free(Member1。name);Member1。nameNULL;}if(NULL!Member2。name){free(Member2。name);Member2。nameNULL;}system(pause);return0;}
  运行如下:
  结论
  使用C语言来说,深拷贝浅拷贝的概念我们不需要深究,在进行结构体拷贝的时候,结构体成员是非指针的话,那么直接赋值是没有任何问题的,建议使用这种方式,避免浅拷贝这类不易发现的错误产生。
  如果成员有指针类型,我们就需要重写拷贝函数,自己定义拷贝行为了,这一点我们需要尤为注意。
  END
  文章来源于技术让梦想更伟大,作者李肖遥
  本文转载自嵌入式微处理器,如有侵权,请联系删除
  原文链接:C语言结构体成员赋值的深拷贝与浅拷贝
  版权声明:本文来源网络,免费传达知识,版权归原作者所有。如涉及作品版权问题,请联系我进行删除。

南财看进博丨探馆进博消费筷子可以加咸味现场提供租鞋换鞋服务视频加载中21世纪经济报道记者易佳颖上海报道11月5日至10日,第五届第五届中国国际进口博览会在上海国家会展中心举行。本届进博会消费品展区超7万平方米的空间里,围绕新生活酷科技最潮民政部等印发通知要求做好最低生活保障等社会救助兜底保障工作本报北京11月9日电(记者李昌禹)近日,民政部会同中央农办财政部国家乡村振兴局联合印发关于进一步做好最低生活保障等社会救助兜底保障工作的通知(以下简称通知),从加大低保扩围增效工作夜读我们的新时代我喜欢大家叫我记者记者节前夕,在朋友圈看到有人晒出一份解放军报特约记者特约通讯员名单,在特约记者那一栏的229个名字中找到了自己,甚感荣幸。我喜欢大家叫我记者,这不仅仅是一种称呼,更是一份责任。无论比利时双人自行车手获金牌BelgianCyclistDuoTakesGold比利时双人自行车手获金牌BelgianCyclistDuoTakesGoldG类场地自行车世界锦标赛于10月22日在法国的伊夫林省圣康坦举行。G类运动是适合于包括残疾人精神脆弱者或郎平爱徒无球可打!29岁刘晏含想去国外打球,27岁张常宁浪费天赋说到郎平刘晏含张常宁相信很多球迷朋友不陌生,她们都是非常出色的女排人,职业生涯都拿到了很不错的成绩。郎平辞去主教练之后,郎平曾经的7仙女阵容也分崩离析,有的退役有的做了手术,中国女NBA篮网对尼克斯昨天没有比赛,宝岛台湾T1联赛利用这个空档炒了一天的霍华德加入,为了提高联赛的关注度,特意申请了外援薪资招募霍华德。不为了银子谁来低水平联赛打球,月薪超过20万,一年下来也不少钱,刘少林刘少昂申请变更国籍11月8日,匈牙利滑冰协会发文,通报了短道速滑名将刘少林和刘少昂兄弟正在申请变更国籍的情况。文中虽未明确指出刘氏兄弟将改为何方国籍,但作为中国短道速滑队主教练张晶曾经的弟子,加之他瓜迪奥拉哈兰德有伤仍被征召参与热身赛,挪威主帅引发争议KTO北京时间11月10日凌晨,英联杯第3轮将会打响一场重磅对决,切尔西客场挑战曼城队。而曼城的主帅瓜迪奥拉在赛前发布会上表示,挪威神锋哈兰德并没有完成恢复,是否出战此场对决暂未确定,同火箭客战猛龙!休城首发出炉,后场双核配戈登,前场双塔继续搭档火箭队北京时间11月10号上午会在客场与猛龙队进行一场比赛,遗憾的是这场比赛猛龙队的全明星大前锋西亚卡姆因伤缺阵,所以在安排首发阵容的时候,猛龙队并没有让西亚卡姆出战。现在这场比赛宇宙的终点在哪里?计算机模拟显示宇宙可能存在自相似性现代科学认为,我们的宇宙诞生于138亿年前,在138亿年前,有一颗奇点发生了爆炸,奇点是一个质量无限大,能量无限大密度无限大热量无限大体积无限小的点,这个点爆炸以后,宇宙快速的向四在冰中发现的史前动物冰是保存自古以来就已知的东西的最佳方式。我们星球的冰层拥有许多我们尚未解开的谜团。已经发现的东西是惊人的,只会激发进一步搜索的兴趣。从史前马到人类最好的朋友的首批代表之一,科学家们
安装Alist绕过Replit检测无硬件云端部署方法头条创作挑战赛新人求关注这是关于Alist的第四篇文章,也是Alist的第三种安装方法。Alist挂载网盘没有NAS,闲置安卓手机也能安装QnapAlistEmbyPlex拒绝写代MetaQuestPro再度降价,现在只要1000美元就能买到了MetaQuestPro是个不错的ARVR设备,但就价格来说肯定是称不上物超所值这四个字。前些时间我们报道过,为了狙击刚出的HTCVIVEXRElite,Meta给QuestPro秒杀夸克!这款浏览器仅1M,安卓用户直呼好用想必大家遇到想查找的资源都会上浏览器搜索一番,但是很多时候找到的结果并不是我们想要的,而且还有乱七八糟的广告,有时候真的蛮烦的。除了大家熟知的浏览器,网上还有各种浏览器层出不穷,一Google云端硬盘文档表格和幻灯片焕然一新谷歌正在更新用户界面,重点是减少混乱,提高生产力。谷歌正准备为其一些最流行的基于云的应用程序发布新的用户界面,包括GoogleDriveGoogleDocsGoogleSheets中科院研究员孙东明给芯片装空调的人左起青海团西宁市兴海路街道党工委书记刘小蓉辽宁团中国科学院金属研究所研究员孙东明贵州团中国天眼总工程师姜鹏。(南方周末记者苏有鹏图)我们已实现包括宇航级到工业级,一系列微型半导体器中科院合肥物质科学研究院科研人员陈春花让核能造福人民美好生活大皖新闻讯有的人谈核色变,有的人却与核共舞。从2005年攻读硕士研究生开始,陈春花就走进了核物理的浩瀚世界。八年前,她回国来到合肥科学岛上,从此两点一线,在核能安全技术研究所里潜心香港大学火星实验室最新开源LiDAR惯性SLAM可实时重建环境网格!以下内容来自小六的机器人SLAM学习圈知识星球每日更新内容点击领取学习资料机器人SLAM学习资料大礼包论文开源代码ImMeshAnImmediateLiDARLocalizatio以核辐射为食!切尔诺贝利发现的神秘生物,人类有望摆脱核威胁吗1986年4月26日凌晨,乌克兰普里皮亚季市的切尔诺贝利核电厂四号反应堆发生了连续爆炸,核反应堆全部炸毁,大火熊熊燃起。爆炸所产生的巨量核辐射尘埃覆飘扬到了大气层中,随着风覆盖了大第37届同里杯天元赛中午落子,柯洁李轩豪等冲击天元挑战权今天中午,第37届同里杯中国围棋天元赛在中国棋院开幕。包括柯洁李轩豪等在内的48名棋坛高手齐聚北京,争夺向现任天元芈昱廷九段挑战的资格。图说棋坛高手齐聚北京,争夺向现任天元芈昱廷九鏖战5个多小时!周泓余赢下中国围棋天元赛性别大战於之莹不敌张涛,无缘晋级。新京报记者孙海光摄新京报讯(首席记者孙海光)3月7日,第37届同里杯中国围棋天元赛在中国棋院落子。两场备受关注的性别大战中,周泓余六段战胜韩一洲八段晋级,王星昊周泓余等晋级,同里杯天元赛32强落位第37届同里杯中国围棋天元赛今天在北京中国棋院结束本选赛的争夺,王星昊周泓余等16名棋手胜出,与柯洁李轩豪等16名种子选手一同跻身本赛32强。明天将开始本届天元赛本赛的首轮比赛。本
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网