C - 语言->内存函数

目录

系列文章目录

前言

1. memcpy使⽤和模拟实现

1.2 memcpy函数的模拟实现:

2. memmove 使⽤和模拟实现

2.1memmove的模拟实现:

3. memset 函数的使⽤

4. memcmp 函数的使⽤


系列文章目录


✅作者简介:大家好,我是橘橙黄又青,一个想要与大家共同进步的男人😉😉

🍎个人主页:橘橙黄又青_C语言,指针-CSDN博客


前言

学习c语言的只要内存函数及其模拟实现,掌握函数返回类型,并模拟。

正文开始了

1. memcpy使⽤和模拟实现

void * memcpy ( void * destination, const void * source, size_t num );

函数内容:作用:复制数据,和前面strcpy相似。返回类型:无返回

1.函数memcpy从source的位置开始 向后复制 num个 字节 的数据到destination指向的内存位置.
2.这个函数在遇到 '\0' 的时候并不会停下来.
3.如果source和destination有任何的重叠,复制的结果都是未定义的.
也就是说:c语言对memcpy的定义是对 不重复内存数据类型进行复制,举个例子:
arr[20] = {1, 2,3, 4, 5, 6, 7, 8}
memcpy(arr, arr+3, 4)//把arr[2]向后的4个字节复制到arr向后的4个字节

memcpy复制都是在同一个数组,内存重叠了,这样是错误的。

memcpy的正确使用例子,代码1:

#include <stdio.h>
#include <string.h>
int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };int arr2[10] = { 0 };memcpy(arr2, arr1, 20);//把arr前面4个整形拷贝到arr2中int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr2[i]);}return 0;
}

输出结果:

1.2 memcpy函数的模拟实现:

#include <stdio.h>
#include <string.h>void * my_memcpy ( void * dst, const void * src, size_t count)//以字节单位复制
{void * ret = dst;assert(dst);//断言是否为NULLassert(src);while (count--) {//搬运conut个字节*(char *)dst = *(char *)src;//void不能解引用,强制转换后,在解引用。dst = (char *)dst + 1;//det++;但是void类型不能++,所以可以写成(char*)dst++;但是一些编译器不支持,所以最好写成改代码这样。src = (char *)src + 1;}return(ret);//返回起始地址
}int main()
{int arr1[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};int arr2[10] = { 0 };my_memcpy(arr2, arr1 + 3, 5 * sizeof(arr[0]);//把4, 5, 6, 7,8复制到arr2去int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr2[i]);}return 0;
}

那对于重叠的内存数据怎么解决呢?cy语言对于重叠的内存,交给memmove来处理。

2. memmove 使⽤和模拟实现

函数内容:

void * memmove ( void * destination, const void * source, size_t num );

函数内容:作用:复制数据。返回类型:无返回。

1.和memcpy的差别就是memmove函数处理的源内存块和⽬标内存块是可以重叠的。
2.如果源空间和⽬标空间出现重叠,就得使⽤memmove函数处理。
举例1:
#include <stdio.h>
#include <string.h>
int main()
{int arr1[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };memmove(arr1+2, arr1, 20);//把12345,拷贝到arr1中的34567上。int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr[i]);}return 0;
}

输出结果:

2.1memmove的模拟实现:

代码分析时有3种情况,待我慢慢给你们分析:

void* my_memmove(void* dst, const void* src, size_t count)
{void* ret = dst;if (dst <= src || (char*)dst >= ((char*)src + count)) {//从后面往前面复制,是第1.2种情况while (count--) {*(char*)dst = *(char*)src;dst = (char*)dst + 1;src = (char*)src + 1;}}else {//从前面往后面复制.第3种情况选择从前面往后面复制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);
}
#include <stdio.h>
#include <string.h>
int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };my_memmove(arr1 + 2, arr1, 20);//把1234,拷贝到arr1中的3456上。int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr1[i]);}return 0;
}

第1种情况:

第2种情况:

第3种情况:

分析第2种:

3. memset 函数的使⽤

函数内容:

void * memset ( void * ptr, int value, size_t num );

功能:memset是⽤来设置内存的,将内存中的值以字节为单位设置成想要的内容。

案例1:

#include <stdio.h>
#include <string.h>
int main ()
{char str[] = "hello world";memset (str,'x',6);//把str前面6个字节换成xprintf(str);return 0;
}

输出结果:

这里我们给一个错误案例2:

#include <stdio.h>
#include <string.h>
int main()
{int arr[10] = { 0 };memset(arr, 1, 40);printf(arr);return 0;
}

输出结果:

总结:memset函数是以字节为单位来改的

4. memcmp 函数的使⽤

函数内容:

int memcmp ( const void * ptr1, const void * ptr2, size_t num );

功能:⽐较从ptr1和ptr2指针指向的位置开始,向后的num个字节。

返回类型:int,以strcmo相似。

案例1:

#include <stdio.h>
#include <string.h>
int main()
{char buffer1[] = "DWgaOtP12df0";char buffer2[] = "DWGAOTP12DF0";int n = memcmp(buffer1, buffer2, sizeof(buffer1));if (n > 0) printf("'%s' is greater than '%s'.\n", buffer1, buffer2);else if (n < 0) printf("'%s' is less than '%s'.\n", buffer1, buffer2);elseprintf("'%s' is the same as '%s'.\n", buffer1, buffer2);return 0;
}

输出结果:

好了,今天就分享到这里了,都看到这里了,点一个赞吧,谢谢。

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

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

相关文章

uniapp实战 —— 猜你喜欢(含滚动触底分页加载)

效果预览 组件封装 src\components\SUI_Guess.vue <script setup lang"ts"> import { ref, onMounted } from vue import type { GuessItem } from /types/index import { getGuessListAPI } from /apis/index import type { PageParams } from /types/global…

如何使用技术 SEO 优化 Pinterest 富图钉

Pinterest 可以影响搜索引擎排名&#xff0c;尤其是谷歌。不过&#xff0c;它的作用方式与其他搜索引擎优化因素不同。这就是 Google 将图钉放在 nofollow 列表中。但是&#xff0c;它们仍然可以作为搜索引擎优化的一个重要因素。 高质量的图钉具有高分辨率的图片、吸引人的内…

(汇川H5U-A8)Modbus Poll与AutoShop使用RS-485通讯

一、初步认识: AutoShop: Modbus Poll: 1、连接配置 ConnectionSerial PortRS-485转串口,所以是串口Serial SettingsCOM3当你插入串口后,会显示新的一个端口,就是这个端口通讯速率9600与PLC协议配置一致数据长度8与PLC协议配置一致奇偶校验位0与PLC协议配置一致停止位2…

用perl解决小朋友问的2的10000次方是多少的问题

2的10000次方是多少&#xff0c;用perl单行命令搞定&#xff0c; perl -Mbigint -le print 2**10000如果是安装了strawberry perl &#xff0c;在Windows控制台上输入&#xff0c;单行命令的单引号要换成双引号。 perl -Mbigint -le "print 2**10000"在git-bash中执…

Linux sed 正则表达式的分组查找和替换

Linux sed 正则表达式的分组查找和替换。 替换IP:PORT信息中的某一段信息&#xff0c;用于IP:端口信息的脱敏。 替换前 cat a01.txt 10.10.32.82:3100 10.10.22.49:21034 10.15.2.246:61501 10.200.18.89:3100 10.200.18.89:21 替换后&#xff08;-E 和 -r 都是EBR扩展模式…

基于LSTM和N-gram序列的英文文本生成(文末送书)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

echarts图之 底部滚动横轴 缩放图形大小

//折线图-堆叠面积图function pileLineChart(odata, dom){//放大缩小的代码startvar dataZoom [],y240;if(odata.xData.length > 7){dataZoom [{show: true,realtime: true,startValue:0, endValue:5,left:"center",top:"auto",right:"auto"…

SAAS版技术中台必备【智能Print打印】系统

今天给大家介绍一个&#xff0c;全网唯一智能打印系统。 系统特色&#xff1a; 1帮助企业&#xff0c;工业&#xff0c;连接多种打印设备管理&#xff1b; 2.跨系统连接打印设备&#xff0c;进行数据传输 3.打通企业内部所有系统打印功能 4.跨越技术壁垒&#xff1b;使用简…

主食罐头哪个牌子好?猫主食罐头品牌分享

进口的猫罐头在近期确实经历了一些困难。由于疫情的影响&#xff0c;许多货品无法正常进口&#xff1b;而最近禽流感的问题也对备受好评的德罐品牌造成了重大冲击。 然而&#xff0c;我们国内生产的猫罐头产品在这段时间展现出了出色的表现。我们推出了许多优质产品&#xff0…

生成器简述 - python 基础进阶知识点补全(一)

可迭代对象&#xff1a; 可以用于for ... in ..循环对对象都是可迭代对象&#xff0c;比如&#xff1a; list tuple dict set 可以迭代的对象就是可迭代对象&#xff0c;python 中一切都是对象&#xff0c;在这里主要说的是变量 a [1,2,3] b (1,2,3,) c "1234&q…

文献速递:多模态影像组学文献分享:生成一种多模态人工智能模型以区分甲状腺良性和恶性滤泡性肿瘤:概念验证研究

文献速递&#xff1a;多模态影像组学文献分享&#xff1a;生成一种多模态人工智能模型以区分甲状腺良性和恶性滤泡性肿瘤&#xff1a;概念验证研究 文献速递介绍 近年来&#xff0c;人工智能&#xff08;AI&#xff09;领域日益被探索&#xff0c;作为一种增强传统医学诊断和…

Failed to resolve org.junit.platform:junit-platform-launcher:1.9.3

springboot 跑 unit test 的时候&#xff0c;如果报错如题的话&#xff0c;可以更改idea 里的 Settings ——> HTTP Proxy 配置为&#xff1a;Auto-detect proxy settings

Google 发布最强大模型Gemini,能力与GPT-4相当

一、Gemini 介绍 Gemini 是一个多模式模型系列&#xff0c;在图像、音频、视频和文本领域展示了真正强大的功能。其中功能最强大的模型 Gemini Ultra 在 32 个基准测试中的 30 个中提升了最先进水平&#xff0c;其中包括 12 个流行文本和推理基准测试中的 10 个、9 个图像理解…

让工作更高效,那些不能错过的8款泳道图绘制工具

在现代企业的运营管理中&#xff0c;泳道图扮演了至关重要的角色。这种独特的图表工具以其直观、清晰的特点&#xff0c;帮助我们理解和改进复杂的工作流程&#xff0c;从而提升效率。本文将为你分享8款实用且高效的泳道图绘制工具&#xff0c;它们能够帮助你轻松创建出专业级别…

Java程序员,你掌握了多线程吗?【文末送书】

目录 摘要 01、多线程对于Java的意义 02、为什么Java工程师必须掌握多线程 03、Java多线程使用方式 04、如何学好Java多线程 参与方式&#x1f947; 推荐一个人工智能学习网站 https://www.captainbed.cn/bear 摘要 互联网的每一个角落&#xff0c;无论是大型电商平台的…

C语言内存函数讲解

目录 文章目录 内存函数针对的数据类型不确定可能是整型数据&#xff0c;字符数据&#xff0c;结构体数据...... memcpy的使用和模拟实现 memcpy的使用 memcpy打印字符数据 memcpy打印整型数据 memcpy的模拟实现 模拟实现的memcpy打印重叠情境 memmove的使用和模拟实现 memm…

为什么出海企业需要呼叫中心?

随着现代商业世界的发展&#xff0c;企业面临着越来越多的挑战和机遇。为了提高客户服务水平、客户满意度、企业形象和销售业绩&#xff0c;呼叫中心已成为越来越多企业的首选。那么&#xff0c;为什么出海企业需要呼叫中心呢&#xff1f; 1. 提高客户服务质量 首先&#xff…

Linux | tar,bc,uname指令

Linux | tar&#xff0c;bc&#xff0c; 文章目录 Linux | tar&#xff0c;bc&#xff0c;tar指令【重要】bc指令uname –r指令 tar指令【重要】 tar [-cxtzjvf] 文件与目录 … 参数&#xff1a; -c &#xff1a;建立一个压缩文件的参数指令(create 的意思)&#xff1b;-x &am…

为什么对中小企业来说,数字化转型很难?

引言 数字化转型对中小企业至关重要&#xff0c;然而&#xff0c;实施这一转型却充满挑战。中小企业面临着资源、技术、文化和安全方面的种种难题&#xff0c;这些困难限制了它们在数字化领域的发展和竞争力。这种挑战不仅影响企业内部运营&#xff0c;还直接影响其与客户和市…

中国的下一个风口:数字化!

——“中国的下一个风口是什么&#xff1f;数字化&#xff1f;你赞同吗&#xff1f;” ——“中国的下一个风口是不是‘数字化’&#xff0c;不敢妄下定论。” 但可以肯定的是&#xff0c;企业想站上未来产业的风口&#xff0c;“数字化”是必经之路。也就是说&#xff0c;数…