浅拷贝(Shallow Copy)
- 定义:浅拷贝是指在拷贝一个结构体时,只是简单地复制结构体中的成员的值。如果结构体的成员包含指针,那么浅拷贝只是复制指针的值,而不是指针所指向的数据。这意味着原始结构体和拷贝后的结构体中的指针成员将指向相同的内存地址。
示例:
#include <stdio.h> #include <stdlib.h> struct MyStruct { int num; int *ptr; }; int main() { struct MyStruct original; original.num = 10; original.ptr = (int *)malloc(sizeof(int)); *original.ptr = 20; struct MyStruct copy = original; // 浅拷贝后,copy.ptr和original.ptr指向相同的内存地址 printf("original.ptr points to %p and copy.ptr points to %p\n", original.ptr, copy.ptr); // 修改copy中的数据 copy.num = 30; *copy.ptr = 40; // 观察original中的数据变化 printf("original.num = %d, *original.ptr = %d\n", original.num, *original.ptr); free(original.ptr); return 0; }
- 解释:
- 在这个示例中,定义了一个包含一个整数成员
num
和一个整数指针成员ptr
的结构体MyStruct
。首先初始化original
结构体,为ptr
成员分配内存并赋值。 - 当进行
struct MyStruct copy = original;
这一浅拷贝操作时,copy
结构体的num
成员获得了original.num
的值,而copy.ptr
获得了original.ptr
的值,也就是它们指向了同一块动态分配的内存。 - 当修改
copy.num
时,original.num
不受影响,因为它们是独立的整数。但是当修改*copy.ptr
时,*original.ptr
也会改变,因为它们指向相同的内存位置。 - 最后,只需要释放
original.ptr
所指向的内存即可,因为copy.ptr
指向的是同一块内存。不过这种共享内存的方式可能会导致问题,比如其中一个结构体释放了指针所指向的内存,另一个结构体再访问该指针就会出现错误(悬空指针)。
- 在这个示例中,定义了一个包含一个整数成员
深拷贝(Deep Copy)
- 定义:深拷贝是指在拷贝一个结构体时,不仅复制结构体中的成员的值,还会复制指针成员所指向的数据。这会创建全新的内存空间来存储数据,使得原始结构体和拷贝后的结构体完全独立,对其中一个结构体的修改不会影响到另一个结构体。
示例:
#include <stdio.h> #include <stdlib.h> struct MyStruct { int num; int *ptr; }; void deepCopy(struct MyStruct *dest, const struct MyStruct *src) { dest->num = src->num; dest->ptr = (int *)malloc(sizeof(int)); *dest->ptr = *src->ptr; } int main() { struct MyStruct original; original.num = 10; original.ptr = (int *)malloc(sizeof(int)); *original.ptr = 20; struct MyStruct copy; deepCopy(©, &original); // 深拷贝后,copy.ptr和original.ptr指向不同的内存地址 printf("original.ptr points to %p and copy.ptr points to %p\n", original.ptr, copy.ptr); // 修改copy中的数据 copy.num = 30; *copy.ptr = 40; // 观察original中的数据变化 printf("original.num = %d, *original.ptr = %d\n", original.num, *original.ptr); free(original.ptr); free(copy.ptr); return 0; }
- 解释:
- 在这个示例中,定义了一个函数
deepCopy
来实现深拷贝。函数接受两个结构体指针,dest
为目标结构体指针,src
为源结构体指针。 - 在
deepCopy
函数中,首先复制src
结构体的num
成员的值到dest
结构体的num
成员。然后为dest
结构体的ptr
成员分配新的内存空间,并且将src.ptr
所指向的数据复制到dest.ptr
所指向的新内存空间中。 - 在
main
函数中,通过deepCopy
函数进行深拷贝。之后可以看到original.ptr
和copy.ptr
指向不同的内存地址。 - 当修改
copy
结构体中的成员时,original
结构体中的成员不会受到影响,因为它们的数据是相互独立的。最后,需要分别释放original.ptr
和copy.ptr
所指向的内存,以避免内存泄漏。
- 在这个示例中,定义了一个函数
总的来说,浅拷贝和深拷贝的主要区别在于对指针成员的处理方式。浅拷贝只是简单地复制指针的值,而深拷贝会复制指针所指向的数据,使得两个结构体在内存使用上更加独立。在实际编程中,需要根据具体的需求来选择合适的拷贝方式。如果结构体中的成员没有指针,浅拷贝和深拷贝的效果是一样的。但如果包含指针,就需要谨慎考虑,避免出现悬空指针、内存泄漏等问题。