结构体中的深浅拷贝
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct Peo { char *name; int age; }peo; int main(void) { peo p1; p1.name = (char *)malloc(sizeof(char) * 30); if (p1.name == NULL) return; strcpy(p1.name, "lihua"); p1.age = 13; peo p2 = p1; printf("p1.name:%s p1.age:%d\np2.name:%s p2.age:%d\n",\ p1.name, p1.age,p2.name,p2.age); if (p1.name != NULL) { free(p1.name); p1.name = NULL; } /*不能再次释放了,这是浅拷贝,只拷贝了一份指针的副本,而没有新开辟内存空间,故不可再释放*/ //if (p2.name != NULL) //{ // free(p2.name); // p2.name = NULL; //} return 0; }
直接用“=”操作符,是浅拷贝,要实现深拷贝,更改代码如下:
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct Peo { char *name; int age; }peo; //深拷贝需要自己分配内存 void mycopy(peo *des,peo *soure) { des->name= (char *)malloc(sizeof(char) * 30); strcpy(des->name, soure->name); des->age = soure->age; } int main(void) { peo p1; p1.name = (char *)malloc(sizeof(char) * 30); if (p1.name == NULL) return; strcpy(p1.name, "lihua"); p1.age = 13; peo p2; mycopy(&p2, &p1); printf("p1.name:%s p1.age:%d\np2.name:%s p2.age:%d\n",\ p1.name, p1.age,p2.name,p2.age); if (p1.name != NULL) { free(p1.name); p1.name = NULL; } if (p2.name != NULL) { free(p2.name); p2.name = NULL; } return 0; }
这样深拷贝之后,就需要释放两次内存。在以后的业务逻辑中,须根据需要选择使用深拷贝还是浅拷贝,但我们要知道,编译的“=”(赋值)操作符是浅拷贝。
欢迎加入作者的小圈子
扫描下方左边二维码加入QQ交流群,扫描下方右边二维码关注个人微信公众号并获取更多隐藏干货,QQ交流群:816747642 微信公众号:Crystal软件学堂
作者:Crystal软件学堂 bilibili视频教程地址:https://space.bilibili.com/5782182 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在转载文章页面给出原文连接。 如果你觉得文章对你有所帮助,烦请点个推荐,你的支持是我更文的动力。 文中若有错误,请您务必指出,感谢给予我建议并让我提高的你。 |