手动实现深拷贝
- 基本思路:
- 对于结构体中的基本数据类型成员(如
int
、float
、char
等),直接进行赋值操作。 - 对于指针类型成员,需要重新分配内存空间,并将原指针指向的数据复制到新分配的内存空间中。
- 对于结构体中的基本数据类型成员(如
示例代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> // 定义一个包含指针成员的结构体 struct Person { char *name; int age; }; // 深拷贝函数 struct Person deepCopyPerson(struct Person src) { struct Person dest; // 为新的name成员分配内存空间 dest.name = (char *)malloc(strlen(src.name)+1); // 复制name字符串 strcpy(dest.name, src.name); // 复制age成员 dest.age = src.age; return dest; } int main() { struct Person p1; p1.name = (char *)malloc(10); strcpy(p1.name, "Alice"); p1.age = 25; struct Person p2 = deepCopyPerson(p1); // 修改p2的成员 p2.age = 30; p2.name[0] = 'B'; // 输出结果 printf("p1: name = %s, age = %d\n", p1.name, p1.age); printf("p2: name = %s, age = %d\n", p2.name, p2.age); // 释放内存 free(p1.name); free(p2.name); return 0; }
- 解释:
- 在上述代码中,定义了
struct Person
结构体,其中包含一个字符指针name
和一个整数age
。 deepCopyPerson
函数用于实现深拷贝。首先创建一个新的struct Person
结构体dest
。然后为dest.name
分配足够的内存空间,大小为src.name
字符串长度加1(用于存储字符串结束符\0
)。接着使用strcpy
函数将src.name
中的字符串复制到dest.name
中,再将src.age
赋值给dest.age
。- 在
main
函数中,首先初始化p1
结构体,然后通过deepCopyPerson
函数创建p2
结构体,这是一个深拷贝的结果。之后修改p2
的成员,可以看到p1
的成员不受影响。最后,需要释放p1.name
和p2.name
所指向的内存,以避免内存泄漏。
- 在上述代码中,定义了
- 基本思路:
利用库函数实现部分功能辅助深拷贝
使用
memcpy
函数(适用于简单的结构体):- 基本思路:当结构体中没有指针成员或者指针成员所指向的数据不需要特别处理(如只包含固定大小的数组)时,可以使用
memcpy
函数来复制结构体。 示例代码:
#include <stdio.h> #include <string.h> struct Data { int numbers[5]; }; struct Data deepCopyData(struct Data src) { struct Data dest; // 使用memcpy进行拷贝 memcpy(&dest, &src, sizeof(struct Data)); return dest; } int main() { struct Data d1 = { { 1, 2, 3, 4, 5} }; struct Data d2 = deepCopyData(d1); d2.numbers[0] = 10; // 输出结果 printf("d1: "); for(int i = 0; i < 5; i++) { printf("%d ", d1.numbers[i]); } printf("\n"); printf("d2: "); for(int i = 0; i < 5; i; i++) { printf("%d ", d2.numbers[i]); } printf("\n"); return 0; }
- 解释:
- 定义了
struct Data
结构体,其中包含一个整数数组numbers
。在deepCopyData
函数中,使用memcpy
函数将src
结构体的内容复制到dest
结构体中。memcpy
函数会按照字节数进行复制,这里复制的字节数是sizeof(struct Data)
,确保完整地复制结构体的内容。 - 在
main
函数中,初始化d1
结构体,然后通过deepCopyData
函数创建d2
结构体。修改d2
结构体中的数组元素,d1
不受影响,这也实现了一种类似深拷贝的效果(在没有指针成员的情况下)。
- 定义了
- 基本思路:当结构体中没有指针成员或者指针成员所指向的数据不需要特别处理(如只包含固定大小的数组)时,可以使用
需要注意的是,在使用memcpy
函数时,要确保目标结构体已经正确初始化并且有足够的空间来接收复制的数据。同时,对于包含指针成员的复杂结构体,单纯使用memcpy
可能无法实现真正的深拷贝,需要结合手动内存分配和数据复制来完成。