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

#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

猜你喜欢

转载自blog.csdn.net/weixin_41576955/article/details/80377161