#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; }
這樣深拷貝之后,就需要釋放兩次內存。在以后的業務邏輯中,須根據需要選擇使用深拷貝還是淺拷貝,但我們要知道,編譯的“=”(賦值)操作符是淺拷貝。
