资料合集下载链接:
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=张三