C言語での浅いコピーと深いコピー(構造)

浅いコピー 

 

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

ディープコピー

構造体のメンバーcharname [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環境を採用する

 

 

 

おすすめ

転載: blog.csdn.net/weixin_42596333/article/details/104504243