当前位置: 首页 > news >正文

C语言结构体赋值与深拷贝

在C语言中,可以通过直接赋值的方式将两个相同类型的结构体变量互相赋值。编译器会执行逐成员拷贝(member-wise copy),即将源结构体的每个成员的值复制到目标结构体的对应成员中。

示例代码

#include <stdio.h>
#include <string.h>// 定义结构体类型
struct Person {char name[50];int age;float height;
};int main() {// 定义两个结构体变量struct Person person1 = {"Alice", 25, 170.5};struct Person person2;// 将person1的值赋给person2(直接赋值)person2 = person1;// 修改person1的成员,验证person2是否独立strcpy(person1.name, "Bob");person1.age = 30;person1.height = 180.0;// 打印结果printf("person1: %s, %d, %.1f\n", person1.name, person1.age, person1.height);printf("person2: %s, %d, %.1f\n", person2.name, person2.age, person2.height);return 0;
}

输出结果

person1: Bob, 30, 180.0
person2: Alice, 25, 170.5

关键点说明

  1. 直接赋值:相同类型的结构体变量可以直接用 = 赋值,编译器会自动处理成员拷贝。

  2. 深拷贝与浅拷贝

    • 如果结构体包含指针成员,直接赋值仅拷贝指针地址(浅拷贝),不会复制指针指向的数据。

    • 如果结构体包含数组或基本类型,直接赋值会复制完整的值(深拷贝)。

  3. 动态内存注意事项

    • 若结构体中有指针指向动态分配的内存,直接赋值可能导致双重释放或内存泄漏。此时需要手动实现深拷贝(如 memcpy 或逐成员赋值)。memcpy具体使用可以参考前文:memcpy 使用指南 (C语言)-CSDN博客

指针成员的深拷贝示例

#include <stdlib.h>
#include <string.h>struct Data {int *values;int count;
};void deepCopyData(struct Data *dest, const struct Data *src) {dest->count = src->count;dest->values = (int *)malloc(src->count * sizeof(int));memcpy(dest->values, src->values, src->count * sizeof(int));
}int main() {struct Data data1 = {(int[]){1, 2, 3}, 3};struct Data data2;deepCopyData(&data2, &data1);  // 手动深拷贝// 释放内存(实际使用中需处理错误)free(data2.values);return 0;
}

总结

  • 相同类型的结构体:直接 = 赋值即可。

  • 含指针的结构体:需手动实现深拷贝,避免共享内存。

http://www.xdnf.cn/news/171577.html

相关文章:

  • django admin 设置字段不可编辑
  • YOLO目标检测之模型剪枝
  • Go RPC 服务方法签名的要求
  • 有关爬虫中数据库的封装——单线程爬虫
  • Tauri窗口与界面管理:打造专业桌面应用体验 (入门系列五)
  • 【Fifty Project - D18】
  • 【2025 最新前沿 MCP 教程 06】构建你的第一个 MCP 服务器:分步指南(源码讲解)
  • 多节管件连接套总成弯扭复合旋转疲劳试验系统
  • PostSwigger Web 安全学习:CSRF漏洞2
  • 现代多核调度器的本质 调度三重奏
  • Github 热点项目 rowboat 一句话生成多AI智能体!5分钟搭建企业级智能工作流系统
  • 在 Cursor 中 配置 GitHub MCP Server
  • 基于ArcGIS的洪水灾害普查、风险评估及淹没制图技术研究​
  • docker(3) -- 图形界面
  • ReACT Agent 实战
  • 面试:结构体默认是对齐的嘛?如何禁止对齐?
  • 遥控器信号传输与信号灯指示要点!
  • 解决新搭建的centos虚拟器,yum下载不了的问题
  • 【音视频】SDL窗口显示
  • DIFY教程第一集:安装Dify配置环境
  • 广度优先搜索(BFS)算法详解
  • 23种设计模式-行为型模式之命令模式(Java版本)
  • 鸿蒙系统应用开发全栈指南
  • HarmonyOS Next~鸿蒙系统流畅性技术解析:预加载与原生架构的协同进化
  • 神经编译革命:如何用脑机接口直接编程量子计算机?
  • 用Function Calling让GPT查询数据库(含示例)
  • 【Git】初始Git及入门命令行
  • 03.使用spring-ai玩转MCP
  • IdeaVim 配置与使用指南
  • 【Part 2安卓原生360°VR播放器开发实战】第二节|基于等距圆柱投影方式实现全景视频渲染