关于浅拷贝和深拷贝(结构体)

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>

typedef struct Node
{
	int size;//保存字符串长度
	char *data;//字符串
}Node;

void CopyNode(Node *node3 , Node node1)//这里是深拷贝,利用函数实现
{
	node3->size = node1.size;
	node3->data = (char *) malloc (node3->size + 1);//这里的字节数+1是因为字符串最后的 '\0'
	assert(node3->data != NULL);

	strcpy (node3->data,node1.data);
}

int main()
{
	Node node1;
	Node node3;
	node1.data = (char *) malloc (100*sizeof(char));//申请一个10个字节的动态内存
	assert(node1.data != NULL);

	strcpy(node1.data,"hello world");
	node1.size = strlen(node1.data);

	Node node2 = node1;

	CopyNode(&node3,node1);//调用上面的函数实现深拷贝
	printf ("%d , %s\n",node1.size,node1.data);
	printf ("%d , %s\n",node2.size,node2.data);
	printf ("%d , %s\n",node3.size,node3.data);
	
	printf ("node1 = %x\n",node1.data);
	printf ("node2 = %x\n",node2.data);
	printf ("node3 = %x\n",node3.data);
	
	free(node1.data);
	//free(node2.data);ERROR//浅拷贝没有拷贝data指向的空间,不需要释放
	free(node3.data);//深拷贝有拷贝data指向的空间,有申请动态内存,需要释放,防止内存泄露
	return 0;
}

就本题而言,来讨论浅拷贝和深拷贝

一、浅拷贝

只是“浅浅”地拷贝,只拷贝数据,而指向的空间以及其存储的数据不拷贝。


Node node2 = node1;
/*这一步仅完成浅拷贝,只是把size,data拷贝过去,
data指向的空间以及存储的数据没有拷贝

*/

        printf ("node1 = %x\n",node1.data);
	printf ("node2 = %x\n",node2.data);//打印这两个data的地址是一样的(图一)

*****浅拷贝只需要释放node1

        

二、深拷贝

在浅拷贝的基础上,多了拷贝指向的空间以及其存储的数据。

在此题中利用函数来实现

void CopyNode(Node *node3 , Node node1)//这里是深拷贝,利用函数实现
{
	node3->size = node1.size;
	node3->data = (char *) malloc (node3->size + 1);//这里的字节数+1是因为字符串最后的 '\0'
	assert(node3->data != NULL);

	strcpy (node3->data,node1.data);
}

CopyNode(&node3,node1);//调用上面的函数实现深拷贝

        /*
说明深拷贝是不仅拷贝了这里的size,data,同时还拷贝了data
指向的空间以及存储的数据,所以需要在后续释放空间node3

*/

        printf ("node1 = %x\n",node1.data);
	printf ("node3 = %x\n",node3.data);//这里的两个data指向的地址不一样(图二)
深拷贝不仅要释放node1,还要释放node3
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值