浅拷贝
#include<stdio.h>
#include<string.h>
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);
}
int main()
{
test01();
return 0;
}
深拷贝
将结构体中的成员char name[64] -> char* name
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct Person{
char* name;
int age;
};
void test01()
{
struct Person p1;
struct Person p2;
p1.age = 18;
p1.name = (char*)malloc(sizeof(char)*64);
strcpy(p1.name,"Tom");
p2.age = 20;
p2.name = (char*)malloc(sizeof(char)*128);
strcpy(p2.name,"Jerry");
p1 = p2;
printf("p1的姓名:%s 年龄: %d\n",p1.name,p1.age);
printf("p2的姓名:%s 年龄: %d\n",p2.name,p2.age);
}
int main()
{
test01();
return 0;
}
上面的程序可以打印出来相应的信息,不会出错。但是如果我们手动显式地释放内存就会出问题。如下
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct Person{
char* name;
int age;
};
void test01()
{
struct Person p1;
struct Person p2;
p1.age = 18;
p1.name = (char*)malloc(sizeof(char)*64);
strcpy(p1.name,"Tom");
p2.age = 20;
p2.name = (char*)malloc(sizeof(char)*128);
strcpy(p2.name,"Jerry");
p1 = p2;
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;
}
}
int main()
{
test01();
return 0;
}
解决方案: 手动做复制操作
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct Person{
char* name;
int age;
};
void test01()
{
struct Person p1;
struct Person p2;
p1.age = 18;
p1.name = (char*)malloc(sizeof(char)*64);
strcpy(p1.name,"Tom");
p2.age = 20;
p2.name = (char*)malloc(sizeof(char)*128);
strcpy(p2.name,"Jerry");
//p1 = p2;
//自己提供复制操作 深拷贝
//先释放原有内容
if(p1.name != NULL)
{
free(p1.name);
p1.name = NULL;
}
p1.name = (char*)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;
}
}
int main()
{
test01();
return 0;
}
采用VS2010环境