#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