C语言基础知识点(十三)结构体的深拷贝与浅拷贝

news2024/11/16 4:46:28

在C或C++等语言中,结构体(Struct)是一种用户自定义的数据类型,它允许将不同类型的数据项组合成一个单一的类型。对于结构体的拷贝,存在深拷贝(Deep Copy)和浅拷贝(Shallow Copy)两种概念,这两种拷贝方式在处理结构体(特别是包含指针成员的结构体)时尤为重要。

浅拷贝(Shallow Copy)

浅拷贝仅仅复制了结构体中的值,如果结构体中含有指针成员,那么浅拷贝会复制指针的值(即内存地址),而不会复制指针所指向的内存区域。这意味着,原结构体和拷贝后的结构体中的指针成员会指向同一块内存区域。因此,如果通过其中一个结构体的指针成员修改了这块内存区域,那么这种修改对另一个结构体也是可见的。

深拷贝(Deep Copy)

深拷贝不仅复制了结构体中的值,还复制了结构体中所有指针成员所指向的内存区域。这意味着,原结构体和拷贝后的结构体是完全独立的,对其中一个结构体的修改不会影响到另一个。

假设我们有一个结构体,它包含一个整型和一个指向整型的指针

#include <stdio.h>
#include <stdlib.h>

typedef struct
{
    int value;
    int *ptr;
} MyStruct;

// 浅拷贝函数
MyStruct shallowCopy(MyStruct src)
{
    MyStruct dst = src; // 直接赋值,为浅拷贝
    return dst;
}

// 深拷贝函数
MyStruct deepCopy(MyStruct src)
{
    MyStruct dst;
    dst.value = src.value;
    dst.ptr = (int *)malloc(sizeof(int)); // 为新指针分配内存
    if (dst.ptr != NULL)
    {
        *dst.ptr = *src.ptr; // 复制指针指向的内容
    }
    return dst;
}

int main()
{
    MyStruct orig = {10, malloc(sizeof(int))};
    *orig.ptr = 20;

    MyStruct shallow = shallowCopy(orig);
    MyStruct deep = deepCopy(orig);

    *shallow.ptr = 30;                                                             // 修改浅拷贝中的指针指向的值
    printf("Orig value: %d, pointer value: %d\n", orig.value, *orig.ptr);          // 预期输出: 10, 30
    printf("Shallow value: %d, pointer value: %d\n", shallow.value, *shallow.ptr); // 预期输出: 10, 30

    *deep.ptr = 40; // 修改深拷贝中的指针指向的值

    printf("Orig value: %d, pointer value: %d\n", orig.value, *orig.ptr); // 预期输出: 10, 30
    printf("Deep value: %d, pointer value: %d\n", deep.value, *deep.ptr); // 预期输出: 10, 40

    // 清理内存
    free(orig.ptr);
    free(shallow.ptr); // 注意:这里不需要释放,因为shallow.ptr和orig.ptr指向同一块内存
    free(deep.ptr);

    return 0;
}

运行结果为

  • 浅拷贝只复制了结构体的值,如果结构体中包含指针,则指针的值(即内存地址)会被复制,但指针指向的内存区域不会被复制。
  • 深拷贝复制了结构体的值,并且为结构体中所有指针成员所指向的内存区域分配了新的内存,并复制了内容。这样,原结构体和拷贝后的结构体在内存中是独立的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1982051.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DataWhale市场博弈和价格预测

文章目录 市场博弈和价格预测任务数据出清价格的形成步骤代码运行 Task1&#xff1a;跑通baseline使用ABM估计市场出清价格转换耗煤量为机组报价保存结果为submit.csv Task2&#xff1a;时间序列挖掘ABM构建学习数据基本信息统计指标分析数据分布分时统计特征不同小时的总负荷和…

错误代码0x80004005:全面解析与解决策略

在Windows操作系统中&#xff0c;错误代码0x80004005是一个相当常见的提示&#xff0c;它通常表示一个未指定的错误或一个无法找到的错误。这个错误可能出现在多种场景中&#xff0c;包括软件安装、系统更新、网络连接、文件操作等。由于其普遍性和模糊性&#xff0c;理解和解决…

搭建链路追踪系统 Jaeger

搭建链路追踪系统 Jaeger 架构 架构图 架构设计 在设计以 Jaeger 为中心的链路追踪系统时&#xff0c;我们采用微服务架构模式。 Jaeger 作为核心追踪系统&#xff0c;负责收集、存储和展示分布式追踪数据。Elasticsearch 作为后端存储&#xff0c;提供数据的持久化和高效…

网鼎杯之unfinish

题目来源&#xff1a;网鼎杯 2018 题目描述&#xff1a;SQL 问题&#xff1a;给一个页面&#xff0c;如何判断其有漏洞 通过awvs扫描得知存在 register.php 注册页面&#xff0c;并且注册界面存在SQL盲注漏洞。 题目提示SQL&#xff0c;在注册页面测试无果&#xff0c;且发现输…

解决Ubuntu报“无法解析域名cn.archive.ubuntu.com“问题

今天在Ubuntu系统上&#xff0c;使用sudo apt update命令&#xff0c;进行更新时&#xff0c;弹出"无法解析域名 cn.archive.ubuntu.com"问题&#xff0c;如图(1)所示&#xff1a; 图(1) 弹出"无法解析域名 cn.archive.ubuntu.com" 错误 出现这种现象的原因…

C++并发编程(一):线程基础

简介 本文学习的是 b 站 up 恋恋风辰的并发编程教学视频做的一些笔记补充。 教程视频链接如下&#xff1a;线程基础&#xff1a;视频教程 文档链接如下&#xff1a;线程基础&#xff1a;笔记文档 理论上直接看 up 提供的笔记文档即可&#xff0c;我这里主要是记录一些我自己…

免费qq号码估价的工具和软件

目前有多种 qq 号码估价的工具和软件。例如&#xff0c;晒号网的 QQ 估价器可以根据 QQ 号码等级、QQ 号码资深度、QQ 号码年限、活跃时间等进行准确的 QQ 号码估价。此外&#xff0c;还有其他一些相关的估价软件和平台&#xff0c;如 QQ 号码估价 2.0 全新玩法&#xff0c;利用…

复现opendrivelab的“点云预测”项目

本文的主要工作就是复现下述论文中的算法。 该论文全称&#xff1a;Visual Point Cloud Forecasting 论文内容在此不做过多介绍&#xff0c;直接上项目。 一、准备工作 首先通读readme.md文件的内容&#xff0c;了解所需要的相关依赖和数据等内容。 一定要多读几遍&#xf…

C# udp通信测试助手

1、UI界面和最终实现功能测试 2、代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threa…

【C++BFS算法】2998. 使 X 和 Y 相等的最少操作次数

本文涉及知识点 CBFS算法 LeetCode2998. 使 X 和 Y 相等的最少操作次数 给你两个正整数 x 和 y 。 一次操作中&#xff0c;你可以执行以下四种操作之一&#xff1a; 如果 x 是 11 的倍数&#xff0c;将 x 除以 11 。 如果 x 是 5 的倍数&#xff0c;将 x 除以 5 。 将 x 减 …

Linux项目实战——业务系统(后附百问网课程视频链接)

处理配置文件 一、main函数流程 初始化显示系统——>初始化输入系统——>初始化文字系统——>初始化页面系统——>业务系统 二、业务系统框架 1. 读取配置文件 2. 根据配置文件生成按钮、界面 3. 读取输入事件 4. 根据输入事件找到按钮 5. 调用按键的OnPressed函…

小程序开发怎么申请HTTPS证书?

小程序开发中申请SSL证书的流程包括选择信任可靠的SSL证书服务商、申请SSL证书、配置服务器、测试验证以等。以下将具体分析这个过程&#xff1a; 1、选择信任可靠的SSL证书服务商&#xff1a; 选择信任可靠的证书服务商&#xff0c;致命的证书服务商可以提供可靠的产品和完善…

【已解决】页面操作系统功能,诡异报错500nginx错误

【已解决】页面操作系统功能&#xff0c;诡异报错500nginx错误&#xff0c;后台没有任何报错信息 不知道啥原因 清理了浏览器缓存 也没有效果 还有一个表现情况&#xff0c;同样的操作&#xff0c;有时可以又是不行 因为报错ng的代理问题&#xff0c;检查了ng配置 后续经过同…

Unity强化工程 之 SpriteEditer SingleMode

本文仅作笔记学习和分享&#xff0c;不用做任何商业用途 本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正 因为unity不只是3d需要&#xff0c;还有2d游戏需要大量编辑处理图片素材&#xff0c;所以需要了解Sprite&#xff08;精灵…

Cesium初探-实体

在 Cesium 中&#xff0c;"实体"&#xff08;Entity&#xff09;是一个核心概念&#xff0c;它代表了可以在场景中渲染的任何东西&#xff0c;从简单的点、线、多边形到复杂的模型和图像。实体可以用来表示地理空间数据&#xff0c;如地标、轨迹、卫星轨道等。 以下…

【数据结构】栈的概念、结构和实现详解

本文来介绍一下数据结构中的栈&#xff0c;以及如何用C语言去实现。 1. 栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;它只允许在固定的一端进行插入和删除元素的操作。 进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。 栈中元素遵循后进先出…

PXE实现linux系统批量自动安装

实验环境&#xff1a; 1、RHEL7主机 2、主机图形化 3、配置网络可用 4、关闭vmware dhcp功能 一、实验环境准备 1、主机图形化 在安装安装RHEL7系统时&#xff0c;选择图形化安装&#xff0c;如果没有选择&#xff0c;可以在后面通过命令安装&#xff0c;如下&#xff1…

Pinia状态管理库

为了跨组件传递JWT令牌&#xff0c;我们就会利用Pinia状态管理库&#xff0c;它允许跨组件或页面共享状态。 使用Pinia步骤&#xff1a; 安装pinia&#xff1a;cnpm install pinia 在vue应用实例中使用pinia 在src/stores/token.js中定义store 在组件中使用store 1.在main.js文…

sql注入靶场sqli-labs常见sql注入漏洞详解

目录 sqli-labs-less1 1.less1普通解法 1.在url里面填写不同的值&#xff0c;返回的内容也不同&#xff0c;证明&#xff0c;数值是进入数据库进行比对了的&#xff08;可以被注入&#xff09; 2.判断最终执行的sql语句的后面还有内容吗&#xff0c;并且能够判断是字符型的拼接…

MySQL增删改查(基础)

1、. 新增&#xff08;Create&#xff09; 语法&#xff1a; INSERT [INTO] table_name[(column [, column] ...)] VALUES (value_list) [, (value_list)] ... 例子&#xff1a; -- 创建一张学生表 DROP TABLE IF EXISTS student; CREATE TABLE student (id INT,sn INT com…