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

C语言 - 深拷贝与浅拷贝详解

深拷贝与浅拷贝详解

在 C 语言编程中,处理指针和动态内存是常见任务。在涉及数据拷贝操作时,我们经常会听到“深拷贝”和“浅拷贝”这两个术语。理解它们之间的区别对于避免程序中的内存错误和数据覆盖问题至关重要。

本文将全面讲解 C 语言中的深拷贝与浅拷贝概念,并通过示例代码展示它们的实际应用场景。

一、基本定义

浅拷贝(Shallow Copy)

浅拷贝是指拷贝变量的值,对于指针变量来说,它只是复制指针的地址值,而不是指针所指向的数据内容。换句话说,浅拷贝后两个指针仍然指向同一块内存区域。

浅拷贝的特点是:

  • 拷贝的是地址(引用)
  • 多个指针指向同一块内存区域
  • 修改一个指针指向的数据,另一个指针也会受到影响

示例代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main() {char *a = malloc(10);strcpy(a, "hello");char *b = a;  // 浅拷贝b[0] = 'H';   // 修改 b 指向的内存内容printf("a: %s\n", a);  // 输出:Hello(a 被改变了)free(a);  // 注意:只能 free 一次,a 和 b 指向同一块内存return 0;
}

深拷贝(Deep Copy)

深拷贝是指除了复制指针的值外,还会为指针所指向的内存区域重新分配一块新的内存空间,并将原数据复制到这块新内存中。这样,拷贝后的指针拥有一份独立的副本,不会互相影响。

深拷贝的特点是:

  • 拷贝的是数据内容
  • 指针指向不同的内存区域
  • 修改一个指针的数据不会影响另一个
  • 可以独立释放内存

示例代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main() {char *a = malloc(10);strcpy(a, "hello");char *b = malloc(10);strcpy(b, a);  // 深拷贝b[0] = 'H';  // 修改 b 指向的内存内容printf("a: %s\n", a);  // 输出:hello(a 未改变)printf("b: %s\n", b);  // 输出:Hellofree(a);free(b);  // 可分别释放return 0;
}

二、应用场景对比

应用场景建议使用方式说明
普通结构体赋值浅拷贝默认按值逐字段复制,无需特别处理
包含指针成员的结构体深拷贝为避免指针成员冲突和重复释放,需要深拷贝指针所指内容
文件缓冲区、数据包等深拷贝数据会变化或释放,不能共享地址
函数参数为指针深拷贝更安全如果函数中有对参数数据的修改需求,建议深拷贝以避免副作用

三、结构体中的深拷贝与浅拷贝

在结构体中,情况会稍复杂一些。结构体赋值默认是按成员值复制的。如果结构体中含有指针成员,那么这种赋值属于浅拷贝。

示例结构体浅拷贝:

typedef struct {char *name;
} Student;void shallow_copy(Student s1, Student *s2) {*s2 = s1;  // 浅拷贝,s1 和 s2->name 指向相同的内存
}

示例结构体深拷贝:

typedef struct {char *name;
} Student;void deep_copy(Student *s1, Student *s2) {s2->name = malloc(strlen(s1->name) + 1);strcpy(s2->name, s1->name);  // 深拷贝指针内容
}

四、如何判断深拷贝还是浅拷贝

以下几个方法可以判断你进行的是深拷贝还是浅拷贝:

  1. 是否使用了 malloc/calloc/realloc 为目标指针重新分配了内存?
  2. 是否使用了 strcpymemcpysnprintf 等拷贝函数复制了实际内容?
  3. 修改目标对象后,源对象是否受到影响?
  4. 是否需要分别释放内存?如果释放一个对象后另一个对象失效,说明是浅拷贝。

五、注意事项与常见错误

  • 重复释放问题:浅拷贝会导致两个指针指向同一块内存,如果对其中一个执行 free(),另一个再使用或释放会导致程序崩溃(double free)。
  • 内存泄漏:深拷贝时忘记释放新分配的内存会导致内存泄漏。
  • 未初始化指针赋值:浅拷贝时指针未初始化直接赋值,会导致非法访问。

六、总结

比较项浅拷贝深拷贝
内存是否共享
是否独立释放否(只能释放一次)是(可分别释放)
拷贝效率相对较低
数据安全性低(可能互相影响)高(数据独立)
使用场景不修改共享数据数据生命周期独立,需隔离时

掌握深拷贝与浅拷贝的概念与应用,能让我们写出更加安全、稳定、健壮的 C 语言程序。特别是在处理结构体、字符串数组、函数传参等涉及指针的场景中,深浅拷贝的正确使用常常决定了程序能否正常运行。


(完)

相关文章:

C语言 - 深拷贝与浅拷贝详解

深拷贝与浅拷贝详解 在 C 语言编程中&#xff0c;处理指针和动态内存是常见任务。在涉及数据拷贝操作时&#xff0c;我们经常会听到“深拷贝”和“浅拷贝”这两个术语。理解它们之间的区别对于避免程序中的内存错误和数据覆盖问题至关重要。 本文将全面讲解 C 语言中的深拷贝与…...

Serverless集群搭建:Knative

文章目录 Knative搭建1.准备工作安装Kubernetes安装 Istio 2.部署Knative Knative搭建 搭建流程图&#xff1a; 1.准备工作 准备工作 ● 本安装操作中的步骤 bash 适用于 MacOS 或 Linux 环境。对于 Windows&#xff0c;某些命令可能需要调整。 ● 本安装操作假定您具有现有…...

今日行情明日机会——20250416

指数在区间震荡&#xff0c;还需要等突破下跌趋势企稳 2025年4月16日涨停的主要行业方向分析 1. 外贸&#xff08;9家涨停&#xff09; 细分领域&#xff1a;跨境物流、纺织出口、供应链服务。代表个股&#xff1a; 五板&#xff1a;泰慕士&#xff08;纺织服装出口龙头&…...

STM32基础教程——DMA

目录 前言 ​编辑 技术实现 接线图 代码实现 技术要点 DMA时钟 DMA初始化 DMA数据传输设置 数据改变与显示 实验结果 问题记录 前言 DMA(Direct Memory Access)直接存储器存取&#xff0c;用来提供在外设和存储器 之间或者存储器和存储器之间的高速数据传输。无需…...

Node.js 中文件系统模块(`fs`)的详细总结,包括定义、作用、各种写入方式及使用场景

Node.js 中文件系统模块&#xff08;fs&#xff09;的详细总结&#xff0c;包括定义、作用、各种写入方式及使用场景&#xff1a; &#x1f9e9; 一、fs 模块简介 ✅ 定义 fs&#xff08;File System&#xff09;是 Node.js 官方内置模块&#xff0c;用于实现对文件和目录的操…...

MyBatis与MyBatis-Plus:字段自动填充的两种实现方式

目录 1. 使用 MyBatis 拦截器实现字段自动填充 2. 使用 MyBatis-Plus 实现字段自动填充 1. 使用 MyBatis 拦截器实现字段自动填充 实现步骤 创建拦截器 实现 MyBatis 的 Interceptor 接口&#xff0c;通过拦截 MyBatis 执行的 SQL 操作来自动填充公共字段 Intercepts({Signa…...

比特率、码元速率(波特率)的定义、关系及相关计算公式

一、相关定义 &#xff08;一&#xff09;比特率 比特率&#xff08;Bit Rate&#xff09;&#xff1a;单位时间内传输的二进制比特数&#xff0c;是信息传输速率的度量。单位&#xff1a;比特每秒&#xff08;bit/s&#xff0c;bps&#xff09;。公式&#xff1a;比特率 传…...

炫云平台全面支持Blender4.4云渲染

随着世界渲染大赛众多优秀作品被大家关注&#xff0c;Blender作为建模渲染一体化的软件&#xff0c;也是众多3D艺术家最常用的软件之一。云渲染自然是提升创作效率必不可少的工作。这篇文章说一下炫云云渲染平台近期对Blender云渲染支持的情况。 首先&#xff0c;炫云客户端已经…...

Python自学第1天:变量,打印,类型转化

突然想学Python了。经过Deepseek的推荐&#xff0c;下载了一个Python3.12安装。安装过程请自行搜索。 乖乖从最基础的学起来&#xff0c;废话不说了&#xff0c;上链接&#xff0c;呃&#xff0c;打错了&#xff0c;上知识点。 变量的定义 # 定义一个整数类型的变量 age 10#…...

Flutter 从零到一

iOS 调试与开发工具指南 真机调试 Xcode run 在控制台获取 Dart VM service URIVSCode 点击 Cmd Shift P 选择 Debug: Attach to Flutter on Device粘贴 the URI 后点击 Enter 对于iOS开发者来说&#xff0c;使用appuploader这样的iOS开发助手可以简化真机调试的准备工作。…...

ocr-身份证正反面识别

在阿里云官网&#xff0c;申请一个token [阿里官方]身份证OCR文字识别_API专区_云市场-阿里云 (aliyun.com) 观察一下post请求body部分json字符串&#xff0c;我们根据这个创建一个java对象 先默认是人像面 public class IdentityBody {public String image;class configure…...

深入解析Spring Boot核心组件及其关键功能

【版本&#xff1a;spring-boot-2.1.3.RELEASE】 深入Spring Boot核心组件 Spring Boot是一个流行的框架&#xff0c;简化了基于Spring的应用程序的开发和部署。它通过自动配置和“开箱即用”的特性&#xff0c;使得开发者可以快速启动和运行应用程序。在Spring Boot中&#x…...

JVM 调优不再难:AI 工具自动生成内存优化方案

在 Java 应用程序的开发与运行过程中&#xff0c;Java 虚拟机&#xff08;JVM&#xff09;的性能调优一直是一项极具挑战性的任务&#xff0c;尤其是内存优化方面。不合适的 JVM 内存配置可能会导致应用程序出现性能瓶颈&#xff0c;甚至频繁抛出内存溢出异常&#xff0c;影响业…...

分层式设备控制架构、分布式微服务架构及插件化架构

在现代高端装备制造&#xff08;如半导体设备、精密自动化系统&#xff09;中&#xff0c;分层式设备控制架构、分布式微服务架构和插件化架构是提升系统灵活性、实时性和可扩展性的核心技术。以下从设计原理、实现方式及行业应用三个维度展开说明&#xff1a; &#xfffc; 1.…...

上门服务 APP 30 亿营收商业模式在乌干达的技术赋能与实践

不久前&#xff0c;非洲乌干达出现黑人女技师提供上门足疗服务的消息引发关注。据了解&#xff0c;当地一次40分钟的上门按摩服务仅需约40元人民币&#xff0c;价格仅为国内同类服务的十分之一。这一现象折射出全球健康服务行业正在经历的数字化转型浪潮。 国内领先的上门服务平…...

Chemical Review IF=51.4 综述 | 柔性机器人的当下与未来:材料、技术与应用的深度融合

2025.03.31. 新加坡南洋理工大学研究团队在《Chemical Reviews》期刊上发表 “Soft Materials and Devices Enabling Sensorimotor Functions in Soft Robots” 综述型文章。软机器人的传感器运动功能对其与环境交互至关重要&#xff0c;本文全面综述了相关软材料和设备。传感技…...

Python抽象基类

abstractmethod 详解 abstractmethod 是 Python 中 abc 模块&#xff08;Abstract Base Classes&#xff0c;抽象基类&#xff09;提供的一个装饰器&#xff0c;用于定义抽象方法。抽象方法是一种在基类中声明但不实现具体逻辑的方法&#xff0c;强制子类必须实现该方法。以下…...

计算机网络中各种物理量的单位总结

在计算机网络中&#xff0c;数据速率的单位容易混淆&#xff0c;以下是清晰总结&#xff1a; 一、基本单位区分 比特&#xff08;bit&#xff09;与字节&#xff08;Byte&#xff09; 小写 b 表示 比特&#xff08;bit&#xff09;&#xff0c;是数据传输的基本单位。 大写 B…...

PCIE网卡驱动DMA初始化配置

1. DMA 启用的时机 e1000e 驱动在 设备初始化阶段 启用 DMA&#xff0c;具体步骤如下&#xff1a; (1) PCIe 设备初始化 调用路径&#xff1a; e1000_probe() → e1000_sw_init() → e1000_init_hw() → e1000_configure() 关键操作&#xff1a; 启用 PCIe 设备的 DMA 主控模…...

音视频小白系统入门笔记-1

本系列笔记为博主学习李超老师课程的课堂笔记&#xff0c;仅供参阅 课程传送门&#xff1a;音视频小白系统入门课 音视频基础ffmpeg原理 往期课程笔记传送门&#xff1a;音视频小白系统入门笔记-0 课程实践代码仓库&#xff1a;传送门 音频采集 命令行采集 Android端音频…...

技术速递|使用 BrowserStack App Automate 和 Appium UI 测试 .NET MAUI 应用

作者&#xff1a;Sweeky&Gerald 排版&#xff1a;Alan Wang 本文是 Gerald 的博客《开始使用 Appium 测试 .NET MAUI 应用的 UI 》中创建的 .NET MAUI – 使用 Appium 和 NUnit 进行 UI 测试的续篇。 在本篇博客中&#xff0c;我们将了解如何使用 BrowserStack App Automa…...

在多系统环境中实现授权闭环,Tetra Pak 借助CodeMeter打造食品工业的安全自动化体系

一、 行业背景与安全新挑战 在食品加工自动化不断深化的背景下&#xff0c;食品安全、功能安全与知识产权保护的需求日益迫切。Tetra Pak 作为全球领先的食品加工和包装解决方案提供商&#xff0c;业务遍布 160 多个国家&#xff0c;涵盖从配料混合、碳酸化处理到全线自动包装。…...

Nginx+SpringBoot跨域那些事儿(多域名跨域加强版——Nginx配置详解)

嘿,小伙伴们,咱们接着上回书说到,当你的应用需要支持多个域名跨域访问时,Nginx+SpringBoot这对黄金搭档绝对是你的不二之选!今天,咱们就深入聊聊如何在Nginx中配置多个域名跨域,让你的应用更加灵活、强大! 一、跨域问题再科普(多域名跨域场景) 在前后端分离开发中,…...

基于Python的App流量大数据分析与可视化方案

一、引言 App流量数据通常包括用户的访问时间、停留时间、点击行为、页面跳转路径等信息。这些数据分散在不同的服务器日志、数据库或第三方数据平台中&#xff0c;需要通过有效的技术手段进行整合和分析。Python在数据科学领域的广泛应用&#xff0c;得益于其简洁的语法、强大…...

windows下使用nginx + waitress 部署django

架构介绍 linux一般采用nginx uwsgi部署django&#xff0c;在Windows下&#xff0c;可以取代uwsgi的选项包括Waitressa、Daphnea、Hypercoma和Gunicorna(通过WSLa 运行)。windows服务器一般采用nginx waitress 部署django&#xff0c;,他们的关系如下 django是WEB应用…...

openssh离线一键升级脚本分享(含安装包)

查看当前的版本 [rootmyoracle ~]#ssh -V相关安装包下载地址 openssh下载地址&#xff1a;http://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssl下载地址&#xff1a;https://www.openssl.org/source/zlib下载地址&#xff1a;http://www.zlib.net/今天演示从7.4升级…...

【专题刷题】双指针(二)

&#x1f4dd;前言说明&#xff1a; 本专栏主要记录本人的基础算法学习以及LeetCode刷题记录&#xff0c;按专题划分每题主要记录&#xff1a;&#xff08;1&#xff09;本人解法 本人屎山代码&#xff1b;&#xff08;2&#xff09;优质解法 优质代码&#xff1b;&#xff…...

Ubuntu服务器中了木马且处于局域网内无法直接通过公网正向连接

如果你的Ubuntu服务器中了木马且处于局域网内无法直接通过公网正向连接,可以尝试以下方法进行应急响应和恢复控制: 一、尝试通过局域网内部访问(优先方案) 如果攻击者未完全封锁你的权限,且你有局域网内其他机器的控制权: 通过跳板机连接: 使用同一局域网内的其他机器…...

Day09 【基于LSTM实现文本加标点的任务】

基于LSTM实现文本加标点的任务 目标数据准备参数配置数据处理模型构建定义模型结构前向传播方法优化器选择 主程序测试与评估类初始化模型评估统计记录显示统计结果 测试结果 目标 本文基于给定的词表&#xff0c;将输入的文本基于jieba分词分割为若干个词&#xff0c;然后基于…...

SQL刷题日志(day2)

1、timestampdiff&#xff1a;计算时间间隔 timestampdiff(unit,start_date,end_date) 参数说明&#xff1a; unit&#xff1a;返回的时间单位&#xff0c;如minute,hour等start_date&#xff1a;开始日期end_date&#xff1a;结束日期 2、dense_rank&#xff08;&#xff…...

仿 ElementUI 搭建自己的 vue 组件库

仿 ElementUI 搭建自己的 vue 组件库 一、创建 my-ui-can 项目1. 新建项目2. 自定义组件3. 创建 MyButton 组件4. 导出组件5. package.json 二、发布到 npm 仓库1. npm 账号注册&#xff08;忽略&#xff09;2. 发布 my-ui-can 二、项目引用 my-ui-can 依赖包方式一&#xff1a…...

CentOS 操作系统下搭建 tsung性能测试环境

写在前面 为何这么安装,实际就是这么做的,这是经过好几次实践得出的经验总结。 这为了让大家更清楚的知道怎么安装 tsung性能测试环境,按步照搬的安装即可。 步骤 1、 下载软件安装包 CentOS-6.0-x86_64-bin-DVD1.iso jdk-6u4-linux-x64-rpm.bin erlang: otp_src_1…...

基于YOLOv9的课堂行为检测系统

基于YOLOv9的课堂行为检测系统 项目概述 本项目是一个基于YOLOv9深度学习模型的课堂行为检测系统&#xff0c;旨在通过计算机视觉技术自动识别和监测课堂中学生的各种行为状态&#xff0c;帮助教师更好地了解课堂教学效果。 项目结构 课堂行为检测/ ├── data/ │ ├──…...

Linux常见工具的基本使用,同时介绍了编译过程和动/静态链接的原理

目录 一、工具的本质 二、一些常用的工具 1.yum 2.vim 1&#xff09;vim的三种基本模式&#xff1a; 2&#xff09;vim的基本操作 ①命令模式下的基本操作&#xff1a; ②插入模式&#xff1a; ③底行模式&#xff1a; 3&#xff09;vim的配置&#xff1a;让他变得更好用 3.gcc…...

6.(vue3.x+vite)动态挂载组件并传递参数和方法

1:效果截图 2:父组件代码 <template><div id="cesiumID"></div><div>子组件使用方法传递给父组件的值:{...

大数据人工智能

在大数据人工智能领域&#xff0c;需要具备多种算法和深度学习知识&#xff0c;以下是一些常见的&#xff1a; 机器学习算法 - 线性回归&#xff1a;用于建立输入特征与连续型输出变量之间的线性关系&#xff0c;常用于预测数值型数据。 - 逻辑回归&#xff1a;主要用于二分类…...

Vue3 nextTick

nextTick 是 Vue 中非常重要的一个 API&#xff0c;它允许你在 DOM 更新周期后执行延迟回调。 核心源码位置 Vue3 的 nextTick 实现主要在 packages/runtime-core/src/scheduler.ts 文件中。 基本实现 const resolvedPromise Promise.resolve() as Promise<any> let …...

快速入手-基于python和opencv的人脸检测

1、安装库 pip install opencv-python 如果下载比较卡的话&#xff0c;指向国内下载地址&#xff1a; pip3 install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple 2、下载源码 https://opencv.org/ windows11对应的版本下载&#xff1a; https://pan.baidu…...

第七节:React HooksReact 18+新特性-并发模式(Concurrent Mode)解决了什么问题?

• 考点&#xff1a;可中断渲染、优先级调度、startTransition使用场景 • 示例&#xff1a;搜索框输入防抖优化 React Hooks 进阶&#xff1a;自定义 Hook 设计实战指南&#xff08;以 useWindowSize 和 useFetch 为例&#xff09; 一、自定义 Hook 设计规范 在实现 useWind…...

jwt的无感刷新

jwt无感刷新 如果没有引入额外的刷新机制&#xff0c;JWT 过期后后续请求就会因验证失败而拒绝&#xff0c;导致用户需要重新登录&#xff0c;从而被“强制下线”。为实现无感刷新&#xff0c;可以考虑以下几种方案&#xff1a; 引入 Refresh Token 双 token 机制&#xff1a;…...

Linux:安装 CentOS 7(完整教程)

文章目录 一、简介二、安装 CentOS 72.1 虚拟机配置2.2 安装CentOS 7 三、连接远程服务器&#xff08;扩展&#xff09;3.1 获取虚拟机 IP 地址3.2 连接远程服务器 四、结语 一、简介 CentOS&#xff08;Community ENTerprise Operating System&#xff09;是一个基于 Linux 的…...

【YOLOv8改进- Backbone主干】CVPR2025 MambaOut :为图像分类任务设计的轻量级模型,曼巴永存!

YOLOV8目标检测创新改进与实战案例专栏 专栏目录: YOLOV8有效改进系列及项目实战目录 包含卷积,主干 注意力,检测头等创新机制 以及 各种目标检测分割项目实战案例 专栏链接: YOLOV8基础解析+创新改进+实战案例 介绍 摘要 “曼巴(Mamba)是一种具有状态空间模型(SSM)的…...

thanos与VictoriaMetrics对比

Thanos 和 VictoriaMetrics 都是开源的时序数据库&#xff08;TSDB&#xff09;解决方案&#xff0c;通常用于存储、查询和管理大规模的时间序列数据&#xff0c;尤其是监控数据。尽管它们在功能上有一些重叠&#xff0c;但它们各自的设计目标、架构、以及适用场景存在差异。以…...

ubuntu 24.02部署java web服务

ubuntu 24.02 版本推荐使用jdk 21版本部署java web服务&#xff0c;开发后先使用sudo java -jar xxx.jar验证运行结果。 jdk安装&#xff1a;sudo apt install openjdk-21-jdk-headless 编辑服务文本 [Unit] DescriptionWebMgr Java Application Afternetwork.target mysql.…...

时序数据预测:TDengine 与机器学习框架的结合(一)

一、引言 在当今数字化时代&#xff0c;时序数据如潮水般涌来&#xff0c;广泛存在于物联网、工业监控、金融交易、气象监测等众多领域。这些按时间顺序记录的数据蕴含着丰富的信息&#xff0c;对其进行准确预测&#xff0c;能够为企业和组织的决策提供有力支持&#xff0c;带…...

SvelteKit 最新中文文档教程(20)—— 最佳实践之性能

前言 Svelte&#xff0c;一个语法简洁、入门容易&#xff0c;面向未来的前端框架。 从 Svelte 诞生之初&#xff0c;就备受开发者的喜爱&#xff0c;根据统计&#xff0c;从 2019 年到 2024 年&#xff0c;连续 6 年一直是开发者最感兴趣的前端框架 No.1&#xff1a; Svelte …...

Spark-SQL核心编程(二)(三)

Spark-SQL核心编程&#xff08;二&#xff09; DSL 语法 DataFrame 提供一个特定领域语言(domain-specific language, DSL)去管理结构化的数据。 可以在 Scala, Java, Python 和 R 中使用 DSL&#xff0c;使用 DSL 语法风格不必去创建临时视图了。 1.创建一个 DataFrame val d…...

Godot学习-创建简单动画

文章目录 1、准备工作Godot资源 2、创建项目3、创建结点4、创建动画1、创建动画2、添加轨道3、创建关键帧3.1 第一个关键帧3.2 第二个关键帧 5、加载后自动播放6、动画循环7、轨道设置1、轨道更新模式2、轨迹插值3、其他属性的关键帧4、编辑关键帧5、使用 RESET 轨道6、洋葱皮 …...

新加坡太白私募:金融创新与稳健发展的典范

在全球金融市场的版图中&#xff0c;新加坡太白私募正以其独特的魅力和卓越的表现&#xff0c;成为众多投资者关注的焦点。作为一家在新加坡注册成立的私募机构&#xff0c;太白私募自诞生以来&#xff0c;便凭借着创新的理念、专业的团队和稳健的运营&#xff0c;在激烈的市场…...

[MySQL] 事务管理(二) 事务的隔离性底层

事务的隔离性底层 1.数据库并发的场景2.读-写2.1MVCC三个变量2.1.1 3个记录隐藏列字段2.1.2 undo日志 模拟MVCCselect 的读取2.1.3 Read View&#xff08;读视图&#xff09; 3.RR与RC的区别 1.数据库并发的场景 读-读&#xff1a;不存在问题&#xff0c;也不需要并发控制读-写…...