结构体赋值问题以及解决

结构体赋值问题以及解决

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

解决方案:

利用深拷贝,手动赋值。

代码示例:

#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;
}

更多文章,敬请关注微信公众号:YQ编程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑马金牌编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值