首页 > 代码库 > 结构体中的深浅拷贝
结构体中的深浅拷贝
#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; }
这样深拷贝之后,就需要释放两次内存。在以后的业务逻辑中,须根据需要选择使用深拷贝还是浅拷贝,但我们要知道,编译的“=”(赋值)操作符是浅拷贝。
结构体中的深浅拷贝
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。