C语言——内存操作函数(memcpy、memmove、memcmp、memset)

这篇具有很好参考价值的文章主要介绍了C语言——内存操作函数(memcpy、memmove、memcmp、memset)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


📘前言

本文章会详解C语言进阶内容,有关内存操作函数(memcpy,memmove,memcmp,memset)的使用说明、API文档该类函数原型以及模拟实现内存函数


📗 一、memcpy(内存拷贝)

📖 1. 函数说明

首先我们从API文档中搜索memcpy查看一下该函数的原型
C语言——内存操作函数(memcpy、memmove、memcmp、memset)

可以看出该函数有三个参数,那么这三个参数的作用分别是什么呢?

该函数的实现思路是将把源头数据const void * source拷贝到目标数据void * destination里去,最后一个参数size_t num则代表需要拷贝多少个字节,这个函数在遇到'\0'的时候并不会停下来。如果source和destination有任何的重叠,复制的结果都是未定义的。

那么它与字符串函数strcpy有什么区别呢?

我们可以看出memcpy的函数参数的返回类型是void*,所以memcpy不考虑你拷贝的数据是何种类型,都可以将原指针指向的空间传入num个字节数拷贝到dest指针处;而strcpy的参数是已经被写死了,传入的类型必须是char类型数据,实现较为单一。

简单的实现一下该函数
C语言——内存操作函数(memcpy、memmove、memcmp、memset)
我们定义了两个int类型的数组,接着使用memcpy,如果想拷贝五个元素到arr2数组中去,因为int类型数组一个元素大小占4个字节,要拷贝五个元素,则第三个参数给的是20个字节。


📖 2. 模拟实现

因为是模拟实现,所以我们需要设计的函数返回类型,参数个数,参数类型都要与其一致。
C语言——内存操作函数(memcpy、memmove、memcmp、memset)

由于数组元素要考虑字节数,所以就涉及到大小端的问题,这里我们以小端为例:1 在内存中十六进制是 0x 00 00 00 01,小端存储是低位放在低地址,高位放在高地址。
C语言——内存操作函数(memcpy、memmove、memcmp、memset)

如果我们需要向上面图解所示,将arr1数组的元素按照每一个字节拿到arr2数组中,一共拿20个字节,我们怎么才能做到一个一个字节拿出来呢?

首先我们需要对指针解引用操作,把*src的内容放到*dest中去,因为一次要拷贝一个字节,我们可以直接强制类型转化成char*类型就可以访问一个字节了。接着继续往后访问,还需要强制类型转化成char*类型再+1让指针往后走;该操作需要执行的次数取决于参数num的取值所以这里用while循环,随着每一次的操作,num–,直到num为0循环结束。最后该函数设计的时候返回的是一个void*指针,所以我们可以在循环操作前,先定义一个void* res用来存放最初始的dest程序结束,return res;就可以了。


💡 3. 运行图示:

C语言——内存操作函数(memcpy、memmove、memcmp、memset)


📗二、memmove

📖 1. 函数说明

由上述memcpy函数想到一个问题,我们在拷贝的时候能不能从同一个数组里,将arr1数组前五个元素拷贝到,从3开始3,4,5,6,7这个位置上,理想结果arr1数组应该是{1,2,1,2,3,4,5,8,9,10}这样的结果可事实真是如此吗?接着我们调试,从监视里观察arr数组的元素
C语言——内存操作函数(memcpy、memmove、memcmp、memset)

从图中可以看出arr1数组运行完的结果与预期的有所差异,下标为2到下标为6的元素变成了1,2,1,2,1了!
C语言——内存操作函数(memcpy、memmove、memcmp、memset)
由图所示从同一个数组中不同位置进行拷贝操作的时候,原空间和目标空间有重叠的时候,拷贝过程中已经将目标空间的数据已经覆盖掉了,后续再进行拷贝操作的时候,拷贝的数据已经不是原空间的数据了。
C语言——内存操作函数(memcpy、memmove、memcmp、memset)
如果是如上情况(src在dest的右边并有重叠部分)就得从4开始拷贝,从前向后拷贝。反之如果src在dest的左边,则需要从后向前拷贝,如果没有重叠部分,从前向后or从后向前都是可行的,因为没有数据不会在拷贝前被覆盖了

所以我们不能使用memcpy函数进行在同一个数组里进行内存拷贝!这时候就要用到另一个内存函数memmove


📖 2. 模拟实现

此时我们只需思考从后往前拷贝时,应该如何实现
C语言——内存操作函数(memcpy、memmove、memcmp、memset)
从图中可知,src是<dest的,所以需要从后往前拷贝,要先找到8这个数,就是src最末位字节,这里是第20个字节,则需要找个下标为19的那个字节,所以用起始位置加上num偏移量-1,则找到了元素为8的字节空间,紧接着解引用赋值给dest末尾的字节空间
C语言——内存操作函数(memcpy、memmove、memcmp、memset)

从调试窗口中可以看出,结果与开始的预测相同
C语言——内存操作函数(memcpy、memmove、memcmp、memset)
模拟完成

💡 3. 运行图示:

C语言——内存操作函数(memcpy、memmove、memcmp、memset)


📗三、memcmp

📖 1. 函数说明

函数原型
C语言——内存操作函数(memcpy、memmove、memcmp、memset)
memcmp是比较内存区域ptr1和ptr2的前num个字节,比较的是内存大小,*注如果两个字符串相同且num值大于字符串长度的话,不会在\0出停下程序,会继续往后进行比较,直到达到num次数

📖 2. 函数的功能(主要作用)

memcmpstrcmp函数功能相似,只不过是可以对所有类型都进行一个字节一个字节的比较,逐字节比较内存的大小。
返回值有三种情况

‘< 0’ :"参数ptr1"与"参数ptr2"逐字节比较,"参数ptr1"数据 < “参数ptr2”;(VS编译器下返回值为 -1
‘= 0’: "参数ptr1"与"参数ptr2"内存大小相等;(VS编译器下返回值为 0
‘> 0’:"参数ptr1"与"参数ptr2"逐字节比较,"参数ptr1"数据 > “参数ptr2”。(VS编译器下返回值为 1

举 ‘>0’ 一例说明:
C语言——内存操作函数(memcpy、memmove、memcmp、memset)


📗三、memset

📖 1. 函数说明

函数原型
C语言——内存操作函数(memcpy、memmove、memcmp、memset)
以字节为单位来设置值
参数分别为:
1 . 一个指向需要被修改的内存空间的地址
2 . 指定修改的内容(int类型)
3 . 需要修改的字节数

📖 2. 函数的功能(主要作用)

memset函数的作用:在指向的内存空间的前num个字节内容修改成所指定的int value的内容,有些类似于memcpy的工作原理。
图示说明
C语言——内存操作函数(memcpy、memmove、memcmp、memset)


📝 总结

以上就是有关C语言进阶的内容,内存操作函数部分的模拟实现和函数使用说明及方法。
希望该篇文章对大家的学习有所帮助,期待与大家共同进步,持续更新中…
点个关注点个赞👍吧!
💗🤍💕💖文章来源地址https://www.toymoban.com/news/detail-457673.html

到了这里,关于C语言——内存操作函数(memcpy、memmove、memcmp、memset)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C语言内存函数精选】memcpy、memset、memmove及仿真实现!掌握内存操作的艺术!

    ❤️ 博客主页: 小镇敲码人 🍏 欢迎关注:👍点赞 👂🏽留言 😍收藏 🌞 任尔江湖满血骨,我自踏雪寻梅香。 万千浮云遮碧月,独傲天下百坚强。 男儿应有龙腾志,盖世一意转洪荒。 莫使此生无痕度,终归人间一捧黄。🍎🍎🍎 ❤️ 我的努力求学没有得到别的好处,只

    2024年02月15日
    浏览(39)
  • memcpy、memmove、memcmp、memset函数的作用与区别

    作用: 从source的位置开始向后复制num个字节的数据到destination的内存位置。 注意: memcpy() 函数在遇到 ’\\0’ 的时候 不会停下来 (strcpy字符串拷贝函数在遇到’\\0’的时候会停下来); destination和source 所指向的内容不能重叠, 否则得不到想要的结果。 void* memcpy(void* destination

    2024年02月14日
    浏览(34)
  • C语言内存函数(memcpy、memmove、memcmp)详解

    memcpy函数为内存拷贝函数,既可以拷贝字符串,也可以拷贝整形数组、浮点型数组等,具有明显的应用优势, destination为目的地空间,source为不可修改(const)的来源空间,num表示无符号的字节数。其主要含义为将source内容拷贝到destination中,拷贝num个字节数。其返回类型、目

    2024年02月07日
    浏览(34)
  • 【C语言】内存函数memcpy和memmove的功能与模拟实现

    1.memcpy 功能:把source指向的前num个字节内容拷贝到destination指向的位置去,可以拷贝任意类型的数据。 注:1.memcpy并不关心\\0,毕竟传的也不一定是字符串,因此拷贝过程中遇到\\0也不会停下来。 2.num的单位是字节,并不是要拷贝的元素个数 3.如果source和destination有任何的重叠

    2024年02月19日
    浏览(40)
  • C语言—模拟实现memcpy,memmove

    函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。 这个函数在遇到 \\\'\\0\\\' 的时候并不会停下来。 如果source和destination有任何的重叠,复制的结果都是未定义的。 其实要实现memcpy非常的简单,我们不管传进来的是哪种数据类型都统一强转为char*,我们知

    2024年02月15日
    浏览(37)
  • 【C语言】memmove()函数(拷贝重叠内存块函数详解)

    🦄 个人主页 :修修修也 🎏 所属专栏 :C语言 ⚙️ 操作环境 : Visual Studio 2022 目录  一.memmove()函数简介 1.函数功能 2.函数参数 1.void * destination 2.onst void * source 3.size_t num 3.函数返回值 4.函数头文件 二.memmove()函数的具体使用 1.使用memmove()函数完成拷贝整型数组数据(目的地与源重

    2024年02月06日
    浏览(38)
  • 【C语言】memcpy()函数(内存块拷贝函数)

    🦄 个人主页 :修修修也 🎏 所属专栏 :C语言 ⚙️ 操作环境 : Visual Studio 2022 目录 一.memcpy()函数简介 🎏函数功能 🎏函数参数 📌void * destination 📌const void * source 📌size_t num 🎏函数返回值 🎏函数头文件 二.memcpy()函数的具体使用 🎏使用memcpy()函数完成拷贝整型数组数据 🎏使

    2024年02月05日
    浏览(37)
  • 提升内功之模拟实现库函数strlen/strncpy/strcmp/strcat/strstr/memcpy/memmove

    strlen函数的作用就是求字符串的首元素开始往后计算字符串的长度,直到’\\0‘,但不会把\\0的长度计算进去 strncpy的作用就是从source指向的字符串复制num个字节的内容到destination指向的字符串去 如果source的长度小于num,则填充0 注意source和destination的内容在空间上不要重叠,如

    2024年02月16日
    浏览(45)
  • memcpy内存拷贝函数

    目录 一、memcpy内存拷贝函数 注意事项 二、memcpy与strcpy对比 三、模拟实现memcpy函数 四、memcpy函数不能进行两块存在内存重叠的空间的内存拷贝 五、改进my_memcpy函数 头文件: string.h 函数原型: void* memcpy(void* destination , const void* source , size_t num) 函数作用: 将源地址中num个字节

    2024年02月07日
    浏览(36)
  • 【c++中内存拷贝函数(C++ memcpy)详解】

    原型 :void*memcpy(void*dest, const void*src,unsigned int count);  功能 :由src所指内存区域复制count个字节到dest所指内存区域。   说明 :src和dest所指内存区域不能重叠,函数返回指向dest的指针。     举例 :  下面自行实现这个函数 程序清单 1 V0.1版程序  程序清单 2 测试V0.1用例   

    2023年04月20日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包