C语言Shallow copy(浅拷贝)代码行为不符合预期的疑问
C语言结构体浅拷贝的疑问解析
你对浅拷贝的理解有个关键偏差:浅拷贝不是修改拷贝对象就一定会影响原对象,得看你修改的是指针本身,还是指针指向的内存内容。
你的代码为什么没影响原对象
你的代码里struct Person p2 = p1;确实是浅拷贝:
- p2的
name指针和p1的name指针,一开始指向的是同一个字符串常量"jon"的内存地址; - p2的
age则直接复制了p1的20(因为int是值类型)。
但你后续的操作是:
p2.name = "mark"; p2.age = 26;
p2.name = "mark"不是修改指针指向的内容,而是把p2的name指针重新指向了另一个字符串常量"mark"的地址,这时候p1的name指针依然指向原来的"jon",所以p1的名字不会变;p2.age = 26修改的是p2自己的age副本(因为int是值类型,浅拷贝就是复制值),自然和p1的age没关系。
真正会影响原对象的浅拷贝场景
如果要让修改p2影响p1,你需要修改指针指向的内存内容,而不是给指针重新赋值。比如用动态分配的内存来存储名字:
#include<stdio.h> #include<stdlib.h> #include<string.h> struct Person { char *name; int age; }; int main (void) { struct Person p1; // 动态分配内存存储名字 p1.name = malloc(20); strcpy(p1.name, "jon"); p1.age = 20; struct Person p2 = p1; // 浅拷贝:p2.name和p1.name指向同一块内存 // 修改指针指向的内容,而非指针本身 strcpy(p2.name, "mark"); p2.age = 26; printf("%s\n", p1.name); // 此时会打印'mark',因为同一块内存被修改 printf("%d\n", p1.age); // 依然是20,age是值拷贝,修改副本不影响原对象 // 记得释放动态分配的内存 free(p1.name); return 0; }
总结
- 对于值类型成员(如int、char):浅拷贝是复制值,修改拷贝对象的成员只会改自己的副本,和原对象无关;
- 对于指针类型成员:浅拷贝是复制指针的地址,只有当你修改指针指向的内存内容时,才会同步影响原对象;如果是给指针重新赋值(指向新的地址),两个指针就不再关联,修改其中一个不会影响另一个。
内容的提问来源于stack exchange,提问作者OussamaTeyib
相关产品推荐
相关产品推荐

