范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

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

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

想放松一下吗?肥西这一疗养基地等你来为更好满足职工群众对疗养的多样化需求发挥职工疗休养对促进经济发展助力乡村振兴的积极作用安徽省总工会先后命名100家单位为安徽省职工疗休养基地其中位于我县紫蓬山下的紫蓬山广源疗养中心上海迪士尼疯狂动物城,最新剧透来了澎湃新闻记者邹佳雯迪士尼粉丝大会上的疯狂动物城展区上海迪士尼乐园度假区微信公众号图上海迪士尼乐园正在建设中的第八个主题园区疯狂动物城,近期传来新的动向。自2019年上海迪士尼度假区河南灵宝乡村美起来生活更幸福来源中国农网盛夏时节,行走在河南省灵宝市乡间,绿树成荫,满目苍翠,昔日的废弃地乱河滩,如今嬗变为欢乐园网红地,从乡臭变乡愁,环境整治成为当地引领乡村振兴的助推器,点亮了农民的幸福生黑河,一座颜值逆天的城市,它拥有20的夏天,并充满了异国风情蜀黍带着妻子在东北边疆自驾旅行,终于来到了边陲小城黑河。关于黑河,民间有一句顺口溜小城不大,风景如画。人口不多,都挺能喝,短短几句,的确道出了小城的美丽和人民的热情豪爽。我们这一次额济纳金秋,醉美胡杨林额济纳旗的黄,是一种摄影师都没法拍摄出来的黄,它通透澄净,片片镀金,如同水洗般过的琉璃身处其中,若有微风徐来,还能听到树枝摇曳,叶叶相撞,发出如沙海碎屑一般的声响,声声入耳这就是金建议中老年远离高嘌呤食物,牢记3吃2不吃,身体健康美滋滋长期以来,困扰中老年人的除了三高,还有一种让人头疼的疾病痛风,痛风的初步症状就是尿酸高,如果出现尿酸高的症状一定要重视了,极大可能是因为摄入了过多高嘌呤食物引起的。防止尿酸高要从日经常放屁是身体有问题?分析了这5种原因,来对照一下在公众场合放屁虽然听起来有些不雅,或者让人尴尬不已,但是它的的确确是我们每个人消化过程必不可少的一部分,而且对身体十分有益。当然也不是说,放屁完完全全就是对身体有益处,相反有时候过失眠心悸可不都是身体虚!这种情况,吃补药反而加重李大夫,我晚上睡不着,心烦胸闷,有时还一阵阵心慌,我觉得是自己身体虚,就用人参泡水喝,但没好转还加重了,这是怎么回事呢?这是因为,药不对症!失眠患者伴有心悸口苦胸闷烦躁恶心纳差小便秋天宁可不吃肉也要吃它,清心安神降心火,简单一煮,营养又滋补导语秋天宁可不吃肉也要吃它,清心安神降心火,简单一煮,营养又滋补生活中我们经常会发现一些以莲子为食材的美食,比较常见的就是银耳莲子粥,还有一些莲子菜等,它不仅是美味佳肴,更是一个保吃宵夜和饿着肚子,哪个对身体的伤害大?告诉你答案每到夜晚,大排档啤酒小龙虾炸鸡就安排起来,无时不刻不在诱惑着饥肠辘辘的熬夜者。但是一想到吃宵夜不利于身体健康,于是很多人宁愿饿着也不吃。那吃宵夜和饿着肚子,哪个对身体的伤害大呢?0入秋后,这3种蔬菜要多吃,每一种对身体大有好处,润肺解秋燥入秋后,这3种蔬菜要多吃,每一种对身体大有好处,润肺解秋燥。哈喽,大家好。我是大厨江一舟。今天又到了和大家分享美食的时刻了,你准备好了吗?这入秋后,市面上各种应季的蔬菜开始大量上市
华为Mate50Pro旗舰智能手机在欧洲正式上市起价为1299欧元华为上周在国内市场推出了名为华为Mate50Pro的旗舰智能手机,现在该公司已确认从欧洲开始在国际市场上推出这款智能手机。华为Mate50Pro的银色和黑色选项价格为1299欧元,李楠分享iOS流畅使用3年技巧点开之后秒懂前魅族副总裁,魅蓝总裁李楠虽然不在手机圈了,但也经常发表一些关于热门手机产品的评论,昨日晚间,他在自己的个人微博分享了一则可以让iPhone流畅使用3年的小技巧。从其给出的截图来看Intel96核战平AMD128核坐等120核大战192核在数据中心平台,IntelSapphireRapidsAMDGenoa两大下一代新品已经多次曝光,型号规格什么的都七七八八了,跑分也不断出现。GeekBench5里又出现了至强铂金秋季外出游玩必备好物清单看看你有吗?文阳光贝拉责编吴雅婷总编唐迪秋天是个适合运动外出骑行的季节,马上国庆节了,也可以多出门走走。那么这些好物你备齐了吗?能让你的出游更开心。1骨传导耳机外出游玩运动肯定少不了音乐,一款1299元起?红米Note12或定档下月,配置真香红米Note系列作为国内千元手机的标杆系列,即便是发布多年后依旧表现出强大的产品力,其多款产品更是备受用户喜爱。根据此前卢伟冰的说法,红米Note系列将会一年两次更新,而目前红米N刚刚,戴森发布迄今最强新品来源玩物志这一刻,我的疲惫,我的沮丧,我的一工作就头疼的品质,都被戴森吸光了。因为就在刚刚,戴森发布了迄今为止最强劲的无绳吸尘器G5Detect!它再次重新定义了,什么是史上最强吸全屋WiFi6覆盖,三台中兴AX5400Pro有线Mesh无线Mesh组网体验前言今年下半年就已经开始实施将家里的网络彻底改造一番了。5月底在淘宝入手了猫棒和光纤收发器也用上了有4个多月的时间啦。6月份改造网络收到猫棒的第一时间就将光猫给替换掉了,那是为了让鞠婧祎的氛围感妆容,初秋又升级,减龄显嫩太美了,赵露思都在画要说贵圈的励志典范,前有周冬雨,现在则是轮到了鞠婧祎,能从普通小美女逆袭成内娱的氛围大美人,她本人的美商真是不得不让人佩服。不仅外形上变美了,颜值飙升,她的各种出圈妆造,也为普通女两位越南世界小姐加冕三年后,身材越来越完美,越来越性感两位越南世界小姐LuongThuyLinh和MaiPhuong出席了宣布1992年的越南小姐HaKieuAnh成为一家美容医院首席执行官的仪式。三位选美皇后盛装打扮,黑色黄色金色不讲真的,口红别找男明星拍广告了,从帅气到油腻,就在一念之间有没有发现,虽然化妆品大多数都是女人在用,可现在的化妆品都喜欢找男明星代言?就连著名编剧汪海林都这样吐槽不同的男的抹口红冲我挤眉弄眼。确实,男明星很多忠实的老婆粉女友粉,看到自家的音画双绝,电视超赞现在的电视机品类太多,但我觉得大多数的电视机都是黒瞎子掰棒子掰一个掉一个,音质做好了,但画质就不尽如人意,画质满意了但音质就没那么出色了。要说什么电视才能达到音画双绝的地步,今天说