深入剖析C++结构体赋值:从“想当然”到“原来如此”的浅拷贝陷阱

资料合集下载链接:

https://pan.quark.cn/s/472bbdfcd014​

在C++编程中,结构体(​​struct​​)是我们组织数据的得力助手。将一个结构体变量赋值给另一个,例如 ​​p2 = p1;​​,看起来是一个再自然不过的操作。然而,这个看似简单的赋值背后,隐藏着一个关键的内存机制——逐字节拷贝。在某些情况下,这种机制会成为一个难以察觉的“陷阱”,导致程序崩溃或内存泄漏。

一、 看起来很美:简单的结构体赋值

首先,让我们从一个最简单的场景开始。我们定义一个​​Person​​结构体,包含姓名和年龄,这两个成员都是基本数据类型或定长数组。

// 案例1: 简单的结构体,不涉及堆内存分配

#include <iostream>
#include <string.h>

struct SimplePerson {
    char name[64];
    int age;
};

int main() {
    SimplePerson p1;
    strcpy(p1.name, "张三");
    p1.age = 20;

    SimplePerson p2;
    strcpy(p2.name, "李四");
    p2.age = 25;

    std::cout << "赋值前:" << std::endl;
    std::cout << "p1: name=" << p1.name << ", age=" << p1.age << std::endl;
    std::cout << "p2: name=" << p2.name << ", age=" << p2.age << std::endl;

    // 执行赋值操作
    p2 = p1;

    std::cout << "\n赋值后:" << std::endl;
    std::cout << "p1: name=" << p1.name << ", age=" << p1.age << std::endl;
    std::cout << "p2: name=" << p2.name << ", age=" << p2.age << std::endl;

    // 修改p1的值,看看是否会影响p2
    p1.age = 30;
    strcpy(p1.name, "王五");

    std::cout << "\n修改p1后:" << std::endl;
    std::cout << "p1: name=" << p1.name << ", age=" << p1.age << std::endl;
    std::cout << "p2: name=" << p2.name << ", age=" << p2.age << std::endl;

    return 0;
}

运行结果:

赋值前:
p1: name=张三, age=20
p2: name=李四, age=25

赋值后:
p1: name=张三, age=20
p2: name=张三
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

web安全工具库

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

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

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

打赏作者

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

抵扣说明:

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

余额充值