结构体的浅拷贝与深拷贝

目录

1. 结构体的浅拷贝

2.  结构体的深拷贝

3. 结构体变量在堆区 结构体的指针成员也指向堆区


1. 结构体的浅拷贝

相同类型的结构体变量可以整体赋值,默认赋值方式为:浅拷贝
浅拷贝:将结构体变量空间内容 赋值一份 到另一个相同类型的结构体变量空间中
如果结构体中没有指针成员 浅拷贝 不会带来问题。
如果结构体中有指针成员 浅拷贝 会带来多次释放堆区空间的问题。
struct Stu
{
int num ;
char * name ;
};
Stu lucy ;
lucy . num = 100 ;
lucy . name = new char [ 32 ];
strcpy ( lucy . name , "hello world" );
Stu bob ;
bob = lucy ;
cout << bob . num << " " << bob . name << endl ;
delete [] lucy . name ;
delete [] bob . name ;

 

2.  结构体的深拷贝

如果结构体中有指针成员 尽量使用深拷贝
所谓的深拷贝,就是为结构体的指针成员 分配独立空间 然后再内容拷贝

struct Stu
{
int num ;
char * name ;
};
Stu lucy ;
lucy . num = 100 ;
lucy . name = new char [ 32 ];
strcpy ( lucy . name , "hello world" );
Stu bob ;
bob . num = lucy . num ;
bob . name = new char [ 32 ];
strcpy ( bob . name , lucy . name );
cout << bob . num << " " << bob . name << endl ;
delete [] lucy . name ;
delete [] bob . name ;

3. 结构体变量在堆区 结构体的指针成员也指向堆区

struct Stu
{
int num ;
char * name ;
};
// 结构体在堆区
Stu * p = new Stu ;
// 结构体中指针成员指向堆区
p -> name = new char [ 32 ];
// 赋值
p -> num = 100 ;
strcpy ( p -> name , "hello world" );
cout << p -> num << " " << p -> name << endl ;
// 释放空间
delete [] p -> name ; // 先释放成员指向
delete p ; // 再释放结构体
  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
结构体拷贝可以分为深拷贝浅拷贝两种方式。 浅拷贝是指将一个结构体的值复制到另一个结构体中,包括结构体成员的基本数据类型和指针地址的复制。当进行浅拷贝时,只是复制了指针的地址,而没有复制指针指向的具体数据。这意味着如果其中一个结构体修改了指针指向的数据,另一个结构体也会受到影响。 深拷贝是指将一个结构体的值复制到另一个结构体中,并且对于指针类型的成员变量,还会将指针指向的数据进行复制。这样,在进行深拷贝后,每个结构体都有自己独立的数据副本,互不影响。 下面是一个示例,演示了浅拷贝深拷贝的区别: ```c #include <stdio.h> #include <string.h> typedef struct { char* name; int age; } Person; void shallowCopy(Person* dest, Person* src) { dest->name = src->name; dest->age = src->age; } void deepCopy(Person* dest, Person* src) { dest->name = malloc(strlen(src->name) + 1); strcpy(dest->name, src->name); dest->age = src->age; } int main() { Person person1; person1.name = "John"; person1.age = 25; Person person2; // 浅拷贝 shallowCopy(&person2, &person1); printf("Shallow copy:\n"); printf("person1 name: %s, age: %d\n", person1.name, person1.age); printf("person2 name: %s, age: %d\n", person2.name, person2.age); // 修改person1的name person1.name = "David"; printf("After modifying person1 name:\n"); printf("person1 name: %s, age: %d\n", person1.name, person1.age); printf("person2 name: %s, age: %d\n", person2.name, person2.age); // person2的name也被修改了 // 深拷贝 deepCopy(&person2, &person1); printf("Deep copy:\n"); printf("person1 name: %s, age: %d\n", person1.name, person1.age); printf("person2 name: %s, age: %d\n", person2.name, person2.age); // 修改person1的name person1.name = "Mike"; printf("After modifying person1 name:\n"); printf("person1 name: %s, age: %d\n", person1.name, person1.age); printf("person2 name: %s, age: %d\n", person2.name,

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

记忆&碎片

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值