- 系统提供的赋值操作是简单的值拷贝,逐字节拷贝---- 浅拷贝
- 如果属性中有指向堆区的内容,在释放期间会导致堆区重复释放,并且还有内存泄露
- 解决方案:利用深拷贝,手动赋值
struct Person { char name[64]; int age; }; void test01() { struct Person p1 = { "Tom", 18 }; struct Person p2 = { "Jerry", 20 }; p1 = p2; printf("p1的姓名: %s 年龄: %d\n", p1.name, p1.age); printf("p2的姓名: %s 年龄: %d\n", p2.name, p2.age); }
struct Person2 { char * name; int age; }; void test02() { struct Person2 p1; p1.age = 18; p1.name = malloc(sizeof(char) * 64); strcpy(p1.name, "Tom"); struct Person2 p2; p2.age = 20; p2.name = malloc(sizeof(char) * 128); strcpy(p2.name, "Jerry"); //p1 = p2; //自己提供赋值操作 深拷贝 //先释放原有内容 if (p1.name != NULL) { free(p1.name); p1.name = NULL; } p1.name = malloc(strlen(p2.name) + 1); strcpy(p1.name, p2.name); p1.age = p2.age; printf("p1的姓名: %s 年龄: %d\n", p1.name, p1.age); printf("p2的姓名: %s 年龄: %d\n", p2.name, p2.age); if (p1.name != NULL) { free(p1.name); p1.name = NULL; } if (p2.name != NULL) { free(p2.name); p2.name = NULL; } }
结构体赋值问题以及解决
最新推荐文章于 2024-07-08 10:29:00 发布