结构体赋值问题以及解决

* 系统提供的赋值操作是简单的值拷贝,逐字节拷贝----浅拷贝
* 如果属性中有指向堆区 的内容,在释放期间会导致堆区重复释放,并且还有内存泄漏。

解决方案:

利用深拷贝,手动赋值。

代码示例:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct Person
{
        char name[64];
        int age;
};
void test01()
{
        struct Person p1 = {"Tom",18};
        struct Person p2 = { "Jerry",28 };
        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 = 28;
        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);
        printf("p1的姓名:%s  年龄:%d\n", p1.name, p1.age);
        printf("p2的姓名:%s  年龄:%d\n", p2.name, p2.age);
        if (p2.name != NULL)
        {
               free(p2.name);
               p2.name = NULL;
        }
        
}
int main()
{
        //test01();
        test02();
        return EXIT_SUCCESS;
}