Cópia superficial e cópia profunda (estrutura) em linguagem C

Cópia superficial 

 

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

Cópia profunda

O membro char nome [64] -> char * nome na estrutura

 

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

O programa acima pode imprimir as informações correspondentes sem erros. Mas se liberarmos a memória de forma manual e explícita, haverá problemas. do seguinte modo

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

           

Solução: Faça a operação de cópia manualmente

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

 

                                                                                                                Adote o ambiente VS2010

 

 

 

Acho que você gosta

Origin blog.csdn.net/weixin_42596333/article/details/104504243
Recomendado
Clasificación