You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 03:15:23