#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