您现在的位置是:首页 >技术交流 >【C/C++】深拷贝与浅拷贝网站首页技术交流
【C/C++】深拷贝与浅拷贝
简介【C/C++】深拷贝与浅拷贝
深拷贝和浅拷贝的区别在于对于指针成员变量的处理方式不同。在C语言中,可以通过手动实现拷贝函数来实现深拷贝和浅拷贝。
下面是一个示例代码,用于说明深拷贝和浅拷贝的区别:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char *name;
int age;
} Person;
// 浅拷贝函数
void shallow_copy(Person *dst, const Person *src) {
memcpy(dst, src, sizeof(Person));
}
// 深拷贝函数
void deep_copy(Person *dst, const Person *src) {
dst->name = malloc(strlen(src->name) + 1);
strcpy(dst->name, src->name);
dst->age = src->age;
}
int main() {
// 浅拷贝
Person p1 = {"Tom", 20};
Person p2;
shallow_copy(&p2, &p1);
printf("p1.name = %p, p2.name = %p
", p1.name, p2.name);
// 深拷贝
Person *p3 = malloc(sizeof(Person));
p3->name = "Jerry";
p3->age = 30;
Person *p4 = malloc(sizeof(Person));
deep_copy(p4, p3);
printf("p3->name = %p, p4->name = %p
", p3->name, p4->name);
free(p3->name);
free(p3);
free(p4->name);
free(p4);
return 0;
}
在这个示例代码中,我们定义了一个Person
结构体,其中包含一个指针成员变量name
和一个整型成员变量age
。在main
函数中,我们首先进行了浅拷贝,将p1
对象的值复制到p2
对象中。由于我们使用了memcpy
函数,这是一种浅拷贝方式,因此p1
和p2
对象中的name
成员变量指向的是同一个内存地址。我们通过输出name
成员变量的地址来验证这一点。
接着,我们进行了深拷贝,将p3
对象的值复制到p4
对象中。由于我们在deep_copy
函数中实现了深拷贝,因此p3
和p4
对象中的name
成员变量指向的是不同的内存地址。我们同样通过输出name
成员变量的地址来验证这一点。
需要注意的是,在进行深拷贝时,需要手动为新对象的指针成员变量分配内存,并在释放内存时手动释放这些内存。
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。