【C初阶——内存函数】鹏哥C语言系列文章,基本语法知识全面讲解

本文由@睡觉待开机原创,转载请注明出处。
本内容在csdn网站首发
欢迎各位点赞—评论—收藏
如果存在不足之处请评论留言,共同进步!

这里写目录标题

  • 1.memcpy使用和模拟实现
  • 2.memmove的使用和模拟实现
  • 3.memset函数的使用
  • 4.memcpy函数的使用

1.memcpy使用和模拟实现

基本语法如下:
在这里插入图片描述
注意:
1.函数的功能:从src的位置开始向后复制n个字节的数据到dest指向的内存位置
2.这个函数正在遇到’\0’并不会停止,memcpy函数并不关心内存的内容
3.如果dest与src有任何的重叠拷贝都是未定义结果,并不在C标准考虑之内

//memcpy的使用
int main()
{int src[10] = { 1,2,3,4,5,6,7,8,9,10};int dest[10] = { 0 };memcpy(dest, src, 20);int i = 0;for (i = 0; i < 10; i++){printf("%d ", dest[i]);}return 0;
}

在这里插入图片描述
那对于重叠的内存空间拷贝呢?
对于重叠的内存空间拷贝,我们需要使用库函数memmove函数
下面是对memcpy函数的模拟实现:

//方法1:
void * memcpy ( void * dst, const void * src, size_t count)
{
void * ret = dst;
assert(dst);
assert(src);
/*
* copy from lower addresses to higher addresses
*/
while (count--) {
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}
return(ret);
}
//方法2:
void* my_memcpy(void* dest, void* src,size_t num)
{assert(dest && src);while (num--){*((char*)dest+num) = *((char*)src+num);}return dest;
}

2.memmove的使用和模拟实现

在这里插入图片描述
注意:
1.和memcpy的差别就是memmove函数处理的源内存块和⽬标内存块是可以重叠的。
2.如果源空间和⽬标空间出现重叠,就得使⽤memmove函数处理。

memmove函数的使用举例:

//memmove函数的使用
int main()
{int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };int arr2[10] = { 1,2,3,4,5,6,7,8,9,10 };memmove(arr1 + 2, arr1, 20);memmove(arr2, arr2+2, 20);int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr1[i]);}printf("\n\n");for (i = 0; i < 10; i++){printf("%d ", arr2[i]);}return 0;
}

在这里插入图片描述
memmove的模拟实现:

//方法1:
void * memmove ( void * dst, const void * src, size_t count)
{
void * ret = dst;
if (dst <= src || (char *)dst >= ((char *)src + count)) {
/*
* Non-Overlapping Buffers
* copy from lower addresses to higher addresses
*/
while (count--) {
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}
}
else {
/*
* Overlapping Buffers
* copy from higher addresses to lower addresses
*/
dst = (char *)dst + count - 1;
src = (char *)src + count - 1;
while (count--) {
*(char *)dst = *(char *)src;
dst = (char *)dst - 1;
src = (char *)src - 1;
}
}
return(ret);
}
//方法2:
void* my_memmove(void* dest, const void* src, size_t num)
{assert(dest && src);if (dest > src){while (num--){*((char*)dest + num) = *((char*)src + num);}}else{while (num--){static int i = 0;*((char*)dest + i) = *((char*)src + i++);}}return dest;
}

3.memset函数的使用

在这里插入图片描述

//memset函数的使用
int main()
{char arr[10] = "abcdef";char* ch = (char*)memset(arr, 'x', 5);printf("%s\n", ch);return 0;
}

在这里插入图片描述

4.memcpy函数的使用

在这里插入图片描述

//memcmp函数的使用
int main()
{char arr[20] = "abcdef";char cmp[20] = "abcxxxxxxxxx";int n = memcmp(arr, cmp, 5);printf("%d\n", n);if (n > 0)printf(">\n");else if (n == 0)printf("=\n");elseprintf("<\n");return 0;
}

在这里插入图片描述

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

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

相关文章

linux安装MySQL5.7(安装、开机自启、定时备份)

一、安装步骤 我喜欢安装在/usr/local/mysql目录下 #切换目录 cd /usr/local/ #下载文件 wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.38-linux-glibc2.12-x86_64.tar.gz #解压文件 tar -zxvf mysql-5.7.38-linux-glibc2.12-x86_64.tar.gz -C /usr/local …

ERP和MES对接的几种接口方式

在数字化工厂的规划建设中&#xff0c;信息化系统的集成&#xff0c;既是重点&#xff0c;但同时也是难点。ERP和MES对接时&#xff0c;ERP主要负责下达生产计划&#xff0c;MES是执行生产计划&#xff0c;二套系统在数据交互时&#xff0c;需要确保基础数据的一致性&#xff0…

SpringBoot源码分析

一&#xff1a;简介 由Pivotal团队提供的全新框架其设计目的是用来简化新Spring应用的初始搭建以及开发过程使用了特定的方式来进行配置快速应用开发领域 二&#xff1a;运行原理以及特点 运行原理&#xff1a; SpringBoot为我们做的自动配置&#xff0c;确实方便快捷&#…

傅里叶级数到傅里叶变换

傅里叶级数 定义形式 f ( t ) 1 2 α 0 ∑ n 1 ∞ [ α n c o s ( n ω t ) β n s i n ( n ω t ) ] f(t)\frac{1}{2}\alpha_0 \sum_{n1}^{\infty}[\alpha_ncos(n\omega t)\beta_n sin(n \omega t)] f(t)21​α0​n1∑∞​[αn​cos(nωt)βn​sin(nωt)] 其中 ω 2 π…

STC8H8K蓝牙智能巡线小车——2. 点亮左右转弯灯与危险报警灯

任务调用示例 RTX 51 TNY 可做多任务调度&#xff0c;API较为简单。 /* 接口API */// 创建任务 extern unsigned char os_create_task (unsigned char task_id); // 结束任务 extern unsigned char os_delete_task (unsigned char task_id);// 等待 extern unsig…

算法训练营Day45(完全背包)

70. 爬楼梯 &#xff08;进阶&#xff09; 题目页面 (kamacoder.com) 完全背包的排列问题 import java.util.Scanner; class Main{public static void main(String [] args){Scanner sc new Scanner(System.in);int m,n;while(sc.hasNextInt()){n sc.nextInt();m sc.nextInt…

C++ 类构造函数 析构函数

类的构造函数 类的构造函数是类的一种特殊的成员函数&#xff0c;它会在每次创建类的新对象时执行。 构造函数的名称与类的名称是完全相同的&#xff0c;并且不会返回任何类型&#xff0c;也不会返回 void。构造函数可用于为某些成员变量设置初始值。 下面的实例有助于更好地…

C#学习教程

目录 版本:VS2022 一、C#简介 程序定义: 程序的的作用:

阿里云如何完全卸载阿里云盾(安骑士)并屏蔽阿里云盾IP

事情说明 为什么买了服务器之后明明什么都没有配置&#xff0c;阿里云却会给你推送服务器的危险消息&#xff1f;如何解决这个问题&#xff1f; 原因 阿里云盾&#xff08;AliYunDun&#xff09;&#xff0c;又名阿里云安骑士&#xff0c;是阿里云自带的云监控软件&#xff…

RTKlib操作手册--使用样例数据演示

简介 RTKLIB&#xff08;Real-Time Kinematic Library&#xff09;是一款开源的实时差分全球导航卫星系统&#xff08;GNSS&#xff09;软件库。它旨在提供高精度的位置解算&#xff0c;特别是在实时应用中&#xff0c;如精密农业、测绘、无人机导航等领域。 RTKLIB支持多种G…

Python 对象属性和类属性

本篇为Python 面向对象之对象和类属性及动态添加属性和方法的概念、示例的学习笔记。 目录 对象属性与类属性 类属性 对象属性 属性优先级 动态对象属性只针对当前对象 动态添加属性和方法 动态添加属性 动态添加方法 引入方法参数处理库 添加方法 限制动态添加属性…

目标检测数据集 - 人脸检测数据集下载「包含VOC、COCO、YOLO三种格式」

数据集介绍&#xff1a;行人检测数据集&#xff0c;真实场景高质量图片数据&#xff0c;涉及场景丰富&#xff0c;比如校园行人、街景行人、道路行人、遮挡行人、严重遮挡行人数据&#xff1b;适用实际项目应用&#xff1a;公共场所监控场景下行人检测项目&#xff0c;以及作为…

如何写好年终总结?

前面有读者留言问年终总结要怎么写&#xff0c;我一听你要聊这个我可不困了&#xff0c;这活我熟啊&#xff0c;谁不知道我厂是 PPT 之王。先来一套打法闭环方法论&#xff0c;再来一套赋能抓手组合拳&#xff0c;如此这般&#xff0c;便可笑傲于江湖。 玩笑归玩笑&#xff0c…

常用界面设计组件 —— 字符串与输入输出组件(QT)

2.2 字符串与输入输出组件2.2.1 字符串与数值之间的转换2.2.2 QString的常用功能 2.2 字符串与输入输出组件 2.2.1 字符串与数值之间的转换 界面设计时使用最多的组件恐怕就是QLabel和 QLineEdit了&#xff0c;QLabel用于显示字符串&#xff0c;QLineEdit用于 显示和输入字符…

MetaGPT-打卡day01

MetaGPT是一个基于大型语言模型&#xff08;LLMs&#xff09;的多智能体协作框架。它利用SOP&#xff08;Standard Operating Procedures&#xff0c;标准作业程序&#xff09;来协调基于大语言模型的多智能体系统&#xff0c;从而实现元编程技术。该框架使用智能体模拟了一个虚…

程序员必备的面试技巧:从忍者到铁金刚的华丽转变

在科技世界的江湖中&#xff0c;程序员作为武林高手&#xff0c;面试是他们闯荡江湖的一场重要考验。在这场考验中&#xff0c;我们需要像忍者一样灵活&#xff0c;像侦探一样聪明&#xff0c;还要像无敌铁金刚一样坚定。本文将带你探索程序员必备的面试技巧&#xff0c;助你书…

ioDraw在线图表工具 - 轻松制作专业图表,只需3步!

还在花大量时间手动画图表&#xff1f;还在为图表样式而烦恼&#xff1f;ioDraw为你提供一站式解决方案&#xff01;ioDraw在线图表工具实现了AI自动生成图表&#xff0c;让你轻松制作专业图表&#xff0c;只需3步&#xff01; 1. 录入数据 只需将你的数据告诉ioDraw AI助手&…

最新版Navicat的安装与激活

最新版Navicat的安装与激活 图文教程链接&#xff1a;图文教程视频教程链接&#xff1a;视频教程此教程适用于Navicat161之后版本的激活&#xff0c;Navicat161之后的版本暂时无法通过注册机的方式进行激活&#xff0c;如需通过注册机激活Navicat161及之前的版本&#xff0c;请…

[Docker] Dockerfile

文章目录 什么是 Dockerfile&#xff1f;使用 Dockerfile 定制镜像开始构建镜像上下文路径 指令详解COPYADDCMDENTRYPOINTENVARGVOLUMEEXPOSEWORKDIRUSERHEALTHCHECKONBUILD 什么是 Dockerfile&#xff1f; Dockerfile 是一个用来构建镜像的文本文件&#xff0c;文本内容包含了…

Pandas实战100例 | 案例 52: 重命名列

案例 52: 重命名列 知识点讲解 在数据处理过程中&#xff0c;有时需要更改 DataFrame 中的列名。Pandas 提供了 rename 方法来轻松实现列的重命名。 重命名列: 使用 rename 方法并通过 columns 参数传递一个字典&#xff0c;可以将旧列名映射到新列名。 示例代码 # 准备数…