文章目录

  • 一、结构体浅拷贝与深拷贝
  • 二、结构体深拷贝
  • 三、结构体深拷贝代码示例

一、结构体浅拷贝与深拷贝


结构体 中 嵌套了 指针 , 指针指向的内存 , 如果需要 malloc 在堆内存中 分配内存 , 如果在 该类型 结构体变量 之间互相赋值 ,

  • 如果直接赋值 , 就是浅拷贝 ;
  • 如果赋值时 , 重新为 指针变量 在堆内存中重新申请内存 , 拷贝数据 , 就是 深拷贝 ;

浅拷贝 只会 拷贝 指针变量的值 , 不会拷贝 指针变量 指向的 内存空间的 数据 ;

二、结构体深拷贝


结构体深拷贝 : 如果要实现结构体的深拷贝 , 需要在 浅拷贝 的基础上 , 重新为 指针 在堆内存中分配数据 ;

/*** @brief copy_student 执行深拷贝操作* @param to* @param from*/
void copy_student(Student *to, Student *from)
{// 结构体内存拷贝// 该拷贝是浅拷贝memcpy(to, from, sizeof (Student));// 结构体直接赋值 , 与上面的代码作用相同// 该拷贝也是浅拷贝//*to = *from;// 重新为 address 分配内存to->address = (char *)malloc(20);// 将 from 中的地址字符串数据 拷贝到 to 中strcpy(to->address, from->address);
}

三、结构体深拷贝代码示例


代码示例 :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>/*** @brief The Student struct* 定义 结构体 数据类型 , 同时为该结构体类型声明 别名* 可以直接使用 别名 结构体变量名 声明结构体类型变量* 不需要在前面添加 struct 关键字*/
typedef struct Student
{// 声明变量时 , 会自动分配这 5 字节内存// 赋值时 , 可以直接使用 = 赋值字符串char name[5];int age;// 声明变量时 , 只会为 4 字节指针分配内存// 具体的 字符串内存 需要额外使用 malloc 申请内存// 赋值时 , 必须使用 strcpy 函数 , 向堆内存赋值char *address;
}Student;/*** @brief copy_student 执行深拷贝操作* @param to* @param from*/
void copy_student(Student *to, Student *from)
{// 结构体内存拷贝// 该拷贝是浅拷贝memcpy(to, from, sizeof (Student));// 结构体直接赋值 , 与上面的代码作用相同// 该拷贝也是浅拷贝//*to = *from;// 重新为 address 分配内存to->address = (char *)malloc(20);// 将 from 中的地址字符串数据 拷贝到 to 中strcpy(to->address, from->address);
}/*** @brief 主函数入口* @return*/
int main(int argc, char* argv[], char**env)
{Student s1;Student s2;// 为 s1.age 赋值s1.age = 18;// 为 s1.name 赋值// 该成员是 数组 , 在 s1 结构体变量声明时 , 就分配好了内存strcpy(s1.name, "Tom");// 给 s1.address 在堆内存分配内存s1.address = (char *)malloc(20);strcpy(s1.address, "Beijing");// 将 s1 赋值给 s2copy_student(&s2, &s1);printf("s1 : name = %s, age = %d, address = %s, %d\n", s1.name, s1.age, s1.address, &s1.address);printf("s2 : name = %s, age = %d, address = %s, %d\n", s2.name, s2.age, s2.address, &s2.address);// 命令行不要退出system("pause");return 0;
}

执行结果 :

s1 : name = Tom, age = 18, address = Beijing, 6422220
s2 : name = Tom, age = 18, address = Beijing, 6422204
请按任意键继续. . .

【C 语言】结构体 ( 结构体深拷贝 )相关推荐

  1. c语言结构体共用体枚举实例程序,10-C语言结构体-共用体-枚举

    结构体是什么? 结构体和数组一样属于构造类型 数组是用于保存一组相同类型数据的,而结构体是用于保存一组不同类型的数组 定义结构体 在使用结构体之前必须先定义结构体类型,因为C语言不知道你的结构体中需要 ...

  2. 【C 语言】结构体 ( 结构体浅拷贝 )

    文章目录 一.结构体浅拷贝与深拷贝 二.结构体浅拷贝 三.结构体浅拷贝代码示例 一.结构体浅拷贝与深拷贝 结构体 中 嵌套了 指针 , 指针指向的内存 , 如果需要 malloc 在堆内存中 分配内存 ...

  3. 【C 语言】结构体 ( 结构体 数组 作为函数参数 | 数组 在 堆内存创建 )

    文章目录 一.结构体 数组 作为函数参数 ( 数组 在 堆内存创建 ) 二.完整代码示例 一.结构体 数组 作为函数参数 ( 数组 在 堆内存创建 ) 在上一篇博客 [C 语言]结构体 ( 结构体 数 ...

  4. C语言如何获取结构体中指定元素的大小?sizeof ( (X*)0 ) -> Y)(空指针操作)

    获取结构体的大小,这好办,这样就可以了: #include <stdio.h>struct user {char name[20];char age[10]; };int main() { ...

  5. C 语言实例 - 使用结构体(struct)

    C 语言实例 - 使用结构体(struct)C 语言实例 C 语言实例 使用结构体(struct)存储学生信息. 实例 #include <stdio.h> struct student ...

  6. Go语言基础之结构体

    转载地址:https://www.liwenzhou.com/posts/Go/10_struct/ Go语言中没有"类"的概念,也不支持"类"的继承等面向对象 ...

  7. c语言 结构体 选择题,C语言结构体共用体选择题(新).doc

    C语言结构体共用体选择题(新).doc 1.变量a所占的内存字节数是.(假设整型int为4字节) struct stu char name20; long int n; int score4; a ; ...

  8. 两个结构体变量可以直接赋值吗_Gox语言中的结构类型-GX6

    Gox语言中,结构类型(struct)其实并不是很常用,因为Gox语言本身就是动态类型的语言,一般的类似结构体的数据直接用数组或者映射类型就可以了,里面的数据项可以是任意类型,包括嵌套复合类型.因此, ...

  9. c语言 结构体ppt,C语言知识学习结构体.ppt

    C语言知识学习结构体.ppt Chap 9 结构,9.1 输出平均分最高的学生信息 9.2 学生成绩排序 9.3 修改学生成绩,本章要点,什么是结构结构与数组有什么差别 有几种结构的定义形式,它们之间 ...

最新文章

  1. 【CV】10种轻量级人脸检测算法大PK | 代码集合开源
  2. 从源码分析DEARGUI之动态特效
  3. 前端入行两年--教会了我这些道理
  4. java short后缀_自学java的新手问个问题,为什么写个代码中的int能自动转
  5. Win10笔记本可以搜索到邻居WiFi却搜不到自家的??
  6. 树莓派zero配置打印机
  7. RAC环境下配置TAF (Final)
  8. 创建 macvlan 网络 - 每天5分钟玩转 Docker 容器技术(55)
  9. Android手机打开开发者模式调试App
  10. 计算机制作贺卡教案,WORD电子贺卡制作的优秀教案_电子贺卡
  11. 解决Windows密码错误无法进入系统的问题
  12. NR、EN-DC等名词解释
  13. 吴裕雄--天生自然 高等数学学习:斯托克斯公式、环流量与旋度
  14. 【python】OpenCV—RGB, Rectangle, Circle, SS(1)
  15. 【AnySDK】项目实战教程
  16. 初入红尘不知人间疾苦
  17. fetchone()和fetchall()的准确读音
  18. 计算机领域的顶会、顶刊
  19. MathType的下载和安装以及添加到word中
  20. 什么样的故障让阿里云换了总裁?

热门文章

  1. 提升python运行效率_斗式提升机(TD、TH、NE型)
  2. java怎么让a取随机_数字连连看的java代码怎么把随机数改成字母啊ba title=个人悬赏 href=javascript:;20C/a/b...
  3. 怎么从转移特性曲线上看dibl_半导体器件原理chapter4.ppt
  4. E. Increasing by Modulo
  5. 小程序实现地图找房功能
  6. 【soliworks】安装soliworks2014
  7. 基于HTML+CSS绘制520情人节爱心飘落动画
  8. Android蓝牙初始名称修改(高通平台)
  9. Rockchip平台蓝牙名称随机化修改
  10. 高精度定位的几种解决方案