#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 p2.name:%s p2.age:%d ", 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 p2.name:%s p2.age:%d ", 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; }
这样深拷贝之后,就需要释放两次内存。在以后的业务逻辑中,须根据需要选择使用深拷贝还是浅拷贝,但我们要知道,编译的“=”(赋值)操作符是浅拷贝。