安庆大理运城常德铜陵江西
投稿投诉
江西南阳
嘉兴昆明
铜陵滨州
广东西昌
常德梅州
兰州阳江
运城金华
广西萍乡
大理重庆
诸暨泉州
安庆南充
武汉辽宁

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

8月24日 斩情道投稿
  文章下方附学习资源,自助领取
  最近在做通信协议的解析处理、传递分析的时候,总是遇到通信帧中的结构体拷贝等问题,而这些问题也是比较基础又易错的C语言知识。今天,我们探究一下结构体的深拷贝和浅拷贝。浅拷贝
  C语言中的浅拷贝是指在拷贝过程中,对于指针型成员变量只拷贝指针本身,而不拷贝指针所指向的目标,它按字节复制的。
  接下来,我们分几种情况举例来看一下。1、结构体中不存在指针成员变量时
  代码如下:在win1064位vs2017来源:技术让梦想更伟大作者:李肖遥includestdio。htypedefstruct{charname〔64〕;}Mintmain(){Memberstu1{LiMing,18};Memberstu2;stu2stu1;printf(s,d,stu2。name,stu2。age);system(pause);return0;}
  运行如下:
  点击获取1V1嵌入式学习规划,现在还送100G精选学习资料。鍜瀛範宓屽叆寮忕墿鑱旂綉寮鍙
  2、结构体中存在指针成员变量时
  代码如下:在win1064位vs2017来源:技术让梦想更伟大作者:李肖遥includestdio。hincludestdlib。hincludestring。htypedefstruct{}Mintmain(){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{}Mintmain(){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{}Mintmain(){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语言结构体成员赋值的深拷贝与浅拷贝
  版权声明:本文来源网络,免费传达知识,版权归原作者所有。如涉及作品版权问题,请联系我进行删除。
投诉 评论 转载

励志让你看了很有感悟的句子1。少年有梦不应止于心动更应付诸行动2。无效的社交的摧毁有趣的灵魂,我的孤独永远骄傲3。能控制早晨的人方可控制一生4。有些事你现在不做,明天也可能不会做,一辈……国姓名字大全女孩单字名国箭(jin)箭:兵器,形容急切、迅速。笔画数:15国慎(shn)慎:注意;小心,谨慎。笔画数:13国帏(wi)帏:帐子、幔幕。笔画数:7国庄(zhung)庄:住宅,别墅……武汉三镇夯实了中超夺冠的脚步在25日晚结束的中超第19轮补赛中,外援回归后的武汉三镇势不可挡,他们在主场以4:0大胜大连人,以53分继续领跑中超。山东泰山与武汉三镇的分差又拉开到了3分,想要卫冕难度加大。……C语言结构体成员赋值的深拷贝与浅拷贝文章下方附学习资源,自助领取最近在做通信协议的解析处理、传递分析的时候,总是遇到通信帧中的结构体拷贝等问题,而这些问题也是比较基础又易错的C语言知识。今天,我们探究一下结……肥皂洗脸可以祛痘吗,这些知识你必须要知道1:为什么肥皂不能洗脸祛痘很多人都问我,肥皂洗脸可以祛痘吗?其实肥皂洗脸并不能帮助你祛除痘痘。相反,如果你使用不当,可能会对你的皮肤造成伤害。肥皂是一种化学物质,其……王晗岁月里,掬一捧思念岁月里,掬一捧思念文王晗不觉初秋夜渐长,清风习习重凄凉。立秋过了几日,下了几场秋雨,多了几处残红,在路边散步,入目之处皆是凄凉之景。夜渐长,褪去了伏天的燥热,少了整……湖南操场邓铃羊了个羊电影适合在湖南郴州的岛屿拍摄自从羊了个羊小游戏火了之后,湖南操场案邓铃也跟着火了。虽然这款小游戏已经火过了一段时间,但依然还深受大众的关注。玩家关注羊了个羊是为了游戏如何通过第二关而火,而湖南操场案……您知道吗,后藏在哪里?内地的朋友经常问我前后藏的区别,我往往回答,前藏大约指的是拉萨一带,以布达拉宫为地标;后藏指的是日喀则一带,以扎什伦布寺为地标。查了查资料,才知道自己的无知和肤浅。藏区有……14省即将重算补发养老金,计发基数相差5千元,补发金额差多少14省即将重算补发养老金,基数相差5千元,补发金额差多少?养老金是大部分退休人员唯一的经济来源,养老金的多少直接决定了退休人员生活质量的好坏。所以,养老金的按时足额发放,……想远离癌症?医生分享9种最便宜的防癌处方,很实用,建议转发癌症指的是上皮组织的恶性肿瘤,也是很常见的一种恶性肿瘤,在生活当中,早期癌症发展较为隐蔽,所以很多患者到晚期才能够发现,很多癌细胞发展到晚期的时候已经出现了扩散和转移的现象,难……宅家动不动就想冲孩子发火?请参考这些高情商父母正确的发脾气方很多父母都有这种体会:脾气本不大,遇娃却易燃易爆炸。其实对于大多数父母来说,每次冲孩子发完脾气,等孩子睡下,看着他熟睡的天使般的面庞,又后悔自责,怪自己没压住火。可……观澜丨对燃油汽车全面退场要全面准备8月22日,海南省印发《海南省碳达峰实施方案》提出,到2025年,公共服务领域和社会运营领域新增和更换车辆使用清洁能源比例达100。到2030年,全岛全面禁止销售燃油汽车。除特……
南极发现迄今最古老海洋DNA报价90亿!许家印迎回春天,广州队渔翁得利,稳留中超重返巅峰双十一赛程过半,红米9A销量登顶,iPhone14只排第二沈春阳瘦身成功,变身白富美?学会科学减肥,或许你也可以象棋杀棋练习五步杀442落实部省战略合作协议暨山西省有机旱作农业现场推进会召开时事热点诺奖专题,其中一位曾任西财金融研究院院士这里是北京人的花篮子,园艺爱好者的天堂,不收门票停车免费10月安卓好评榜,小米继续霸榜,网友小米12SUltra高端加密货币波动性下降,美元市场仍然是加密行情涨跌的重要影响因素甘南到底有多美,你去了才知道8位被名字拖累的明星以为取得有个性,实际拗口又难记欠钱不还起诉书如何写的秦富人摄影作品遭侵权如何举证再回首抽烟的坏习惯,可能让家人的口腔癌风险增加近一倍,你还抽吗?一方婚前借款算共同债务吗温家宝总理抗震救灾话筒承载哪三重历史价值打篮球的400字作文经典的谚语格言大全乘风破浪姐姐娱乐圈情商更重要,海陆无脑,张萌带资源进组选角炖肉炖排骨记住三不放,肉香汤鲜无腥味中国寓言《新媳妇》故事原文

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找七猫云易事利