结构体赋值问题以及解决
* 系统提供的赋值操作是简单的值拷贝,逐字节拷贝----浅拷贝
* 如果属性中有指向堆区 的内容,在释放期间会导致堆区重复释放,并且还有内存泄漏。
解决方案:
利用深拷贝,手动赋值。
代码示例:
#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;
}