内存操作函数:

memcpy
menmove
memset
memcmp

一、memcpy – #include<string.h>

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

  • 任意类型字符拷贝,将num个字节的值从source指向的位置直接复制到destination指向的存储块;
  • 函数遇到’ \0 '不会自动停止;

模拟实现

void *memcpy(void *dest, const void *src, size_t count)
{void *ret = dest;assert(dest);assert(src);while (count--) {*(char*)dest = *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;}return ret;
}
int main()
{char dest[32] = "xbsjabcj";char src[32] = "safdjkbfsj";int  count = 5;printf("%s\n", memcpy(dest, src, count));system("pause");return 0;
}

运行结果

二、memmove – #include<string.h>

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

  • 移动内存块、将num个字节的值从source指向的位置复制到destination指向的存储块。复制就像使用中间缓冲区一样进行,从而允许目标和源重叠;

分析:

内存拷贝会产生三种常见情况:
第一种: 需要使用从前向后拷贝

第二种:不论如何拷贝都不会发生内存重叠问题

第三种:需要采用从后向前拷贝

模拟实现

void *memmove(void *dest, const void *src, size_t count)
{void *ret = dest;if (dest <= src || (char*)dest >= ((char*)src + count)) {while (count--) {*(char*)dest = *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;}}else {dest = (char*)dest + count - 1;src = (char*)src + count - 1;while (count--) {*(char*)dest = *(char*)src;dest = (char*)dest - 1;src = (char*)src - 1;}}return ret;
}
int main()
{char dest[32] = "xbsjabcj";char src[32] = "safdjkbfsj";int  count = 5;printf("%s\n", memmove(dest, src, count));system("pause");return 0;
}

三、memset – #include<string.h>

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

  • 填充内存块、将ptr指向的内存块的前num个字节设置为指定值(解释为unsigned char)
int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,10 };memset(arr, 0, 10);           //10 ----- 表示 10 个字节,即将 arr 数组起始的 10 个字节空间内容设置为0 return 0;
}

四、memcmp – #include<string.h>

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

  • 比较两个内存块
int main()
{int arr1[] = { 1,2,3,4,5 };int arr2[] = { 1,2,3,3,3 };int ret = memcmp(arr1, arr2, 12);//此处比较两个内存空间的 12 个字节内容,即 1,2,3  故 ret=0printf("ret = %d\n", ret);return 0;
}

详细代码可参考本人 GitHub 链接:

https://github.com/Coderxingchild/C-/blob/master/内存操作函数/内存操作函数/mem_.c

(博客内容为原创,有任何问题可以私聊)

mem***系列函数相关推荐

  1. Mem系列函数介绍及案例实现

      昨天导师甩给我们一个项目案例,让我们自己去看一看熟悉一下项目内容,我看到了这个项目里面大量使用memset(sBuf,0,sizeof(sBuf));这一块内存填充的代码,于是回想起以前查过Mem ...

  2. mem系列函数使用总结

    mem系列函数是我们在平时写C++的过程中经常会用到的函数,现在写一篇博客来总结一下它们的用法.mem系列函数主要是用来操作内存,使用这些函数需要在源文件中包含头文件cstring. memset 函 ...

  3. mem系列函数(memcpy)

    看了好多面经之后,我发现有很多题目都似乎很简单,但是如果要自己写的话,总感觉能写出个大概,但好像差点什么,所以我打算把见过的面试题总结出来,方便以后复习. memcpy 下面是我们常见的的错误写法: ...

  4. C++ mem系列函数

    void* memcpy( void *dest, const void *src, size_t count ); 拷贝内存区域 [src, src+count) 到内存区域 [dest, dest ...

  5. Str库系列函数合集(strlen、strcpy、strcmp、strcat、strchr等)

    关于Str函数,网上五花八门,使初学者很容易迷失方向,笔者在这里做一个常用函数的总结.希望对读者起到些许帮助. 后续会持续更新特殊函数~ 想了解mem系列函数的,请猛戳这里→mem系列函数 代码 // ...

  6. mem库系列函数合集(memset、memchr、memcmp、memcpy)

    关于Mem函数,网上五花八门,使初学者很容易迷失方向,笔者在这里做一个常用函数的总结.希望对读者起到些许帮助. 想了解Str系列函数的,请猛戳这里→Str系列函数大全 代码 //头文件:#includ ...

  7. platform_device_系列函数及其设备注册的作用

    platform_device_系列函数,实际上是注册了一个叫platform的虚拟总线.使用约定是如果一个不属于任何总线的设备,例如蓝牙,串口等设备,都需要挂在这个虚拟总线上. driver/bas ...

  8. windows线程同步-原子操作-Interlocked系列函数(用户模式)

    Interlocked系列函数用来保证原子访问. InterlockedExchangeAdd提供保证long类型的原子操作. InterlockedExchangeAdd64提供long long ...

  9. 浅析php curl_multi_*系列函数进行批量http请求

    何起: 一系列 数量很大 数据不热 还希望被蜘蛛大量抓取的页面,在蜘蛛抓取高峰时,响应时间会被拉得很高. 前人做了这样一个事儿:页面分3块,用3个内部接口提供,入口文件用curl_multi_*系列函 ...

最新文章

  1. 二十世纪最伟大的10大算法
  2. javaScriptDay01
  3. taskscheduler java_java – 针对不同任务的不同taskScheduler
  4. 超声声场模拟_超声全聚焦(TFM)简介
  5. 轻松上云系列之二:其他云数据迁移至阿里云
  6. java spring hiberate_Spring+SpringMVC+Hibernate整合实例讲解
  7. 【To Understand】动态规划:求最长公共子串/最长公共子序列
  8. openSUSE Tumbleweed 支持 Linux Kernel 4.20
  9. 深度学习中常用的数据集
  10. Fabric环境配置
  11. 土方工程量计算表格excel_市政道路土方excel计算表(含公式)
  12. 如何在项目中规范git commit格式
  13. 为RK3399,树莓派等开发板安装安卓、Linux等系统
  14. PUBWIN密码攻防战 打造永攻不破的密码!(转)
  15. 华硕 ASUS D540MC 台式计算机,华硕商用D540MC台式电脑增强校园硬实力
  16. Kubernetes切换Docker容器引擎为Containerd
  17. Python 每日一记217根据词频生成词云图
  18. U盘启动制作Ventoy v1.0.87
  19. 批量启动docer容器shell脚本
  20. ubuntu16.04成功安装 百度网盘 by deepin-wine-for-ubuntu

热门文章

  1. 傅里叶光学(二)一维光栅与二维光栅的夫琅禾费衍射
  2. Can't find bundle for base name XXXX, locale zh_CN解决方法
  3. Iverilog 源码分析 -- VPI的实现
  4. 谁能告诉我怎么获得C币鸭
  5. 区块链的商业价值 区块链技术开发公司哪家好
  6. 一个Vue页面的内存泄露分析
  7. 2021年中国民爆行业企业经营情况及主要产品产销量分析:工业雷管、工业炸药产销量均有所下滑[图]
  8. ANSYS谱分析的概念、过程及关键点解析
  9. Archlinux 命令行模式-安装 BIOS 非 UEFI(实装笔记)
  10. 自然语言处理笔记11-哈工大 关毅