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

内存函数memcpy和memmove

memcpy 内存拷贝

函数原型:void * memcpy(void * destination , void * source, size_t num);

  1. 函数mencpy从source的位置开始向后复制num个字符的数据到destinaton的内存位置
  2. 这个函数遇到’\0’并不会停下来
  3. 如果source和destination有任何的重叠,复制的结果都是未定义的
  4. 用于两块独立的内存之间的拷贝
int main()
{int arr1[] = {1, 2, 3, 4, 5, 6, 7};int arr2[10] = {0};memcpy(arr2, arr1, 28);   //最后一个参数的单位是byte
}

模拟实现memcpy函数,如下:


void* my_memcpy(void* dest, const void* src, size_t num)
{assert(dest && src);void* p = dest;while (num--){*(char*)dest = *(char*)src;dest =(char *)dest + 1;src = (char*)src + 1;}return p;
}

memmove 内存移动

函数原型:void * memmove ( void * destination, const void * source, size_t num );

  1. Copies the values of num bytes from the location pointed by source to the memory block pointed by destination. Copying takes place as if an intermediate buffer were used, allowing the destination and source to overlap.
  2. 用于同一块内存的覆盖拷贝
int main ()
{char str[] = "memmove can be very useful......";memmove (str+20,str+15,11);  //用于同一块内存的覆盖拷贝puts (str);return 0;
}

输出

memmove can be very very useful.

memcmp 比较内存中两个数据的大小

函数原型:int memcmp(const void *ptr1, const void * ptr2, size_t num);

  1. 比较从ptr1和ptr2指针开始的num个字节
  2. 返回值如下:
return valueindicates
< 0the first byte that does not match in both memory blocks has a lower value in ptr1 than in ptr2 (if evaluated as unsigned char values)
0the contents of both memory blocks are equal
> 0the first byte that does not match in both memory blocks has a greater value in ptr1 than in ptr2 (if evaluated as unsigned char values)
int main()
{int arr1[] = {1, 2, 3, 4, 5};int arr2[] = {1, 3, 2};int ret = memcmp(arr1, arr2, 12);   //比较是按一个字节一个字节的比较printf("%d\n", ret);
}

输出

-1

memset 内存设置指定的值

函数原型:void * memset(void *ptr, int value, size_t num);

  1. Sets the first num bytes of the block of memory pointed by ptr to the specified value (interpreted as an unsigned char).
  2. 按字节设置。

用法一:设置字符的值

int main ()
{char str[] = "almost every programmer should know memset!";memset (str,'-',6);puts (str);return 0;
}

输出

------ every programmer should know memset!

用法二,设置int型的值

int main()
{int arr[] = { 1, 2, 3, 4, 5 };int i = 0;memset(arr, 1, 20);for (i = 0; i < 5; i++){printf("%d ", arr[i]);}
}

输出

16843009
16843009
16843009
16843009
16843009

由以上结果分析,由于memset是按字节一个一个的来设置value,所以int型的变量,就是被设置为:0x01010101 即为16843009;

随意meset对int型的通常用法是清零:memset(arr, 0 ,20)

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 谷歌chrome浏览器显示“版本太旧”又无法更新情况下,如何关闭“Chrome版本太旧”提示,包括直接启动Google浏览器,或者通过其他应用启动
  • Web层统一实体规范封装
  • 出现 2003 - Can’t connect to MySQL server on ‘xxx‘(10060) 解决方法
  • 3b1b自注意力机制讲解记录
  • 3、springboot时代背景
  • Variomes:支持基因组变异筛选的高召回率搜索引擎
  • 0基础深度学习项目13:基于TensorFolw实现天气识别
  • JavaScript初级——DOM和事件简介
  • 递归神经网络 (RNN) 简介
  • 【微信小程序】自定义组件 - behaviors
  • 微服务:配置管理和配置热更新
  • PostgreSQL 内核资源管理
  • 2024下半年软考有哪些科目开考?该怎么选?
  • PHP开发过程中常见问题快速解决
  • Kakfa的核心概念-Replica副本(kafka创建topic并指定分区和副本的两种方式)
  • 【css3】浏览器内核及其兼容性
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • AWS实战 - 利用IAM对S3做访问控制
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • ES6系统学习----从Apollo Client看解构赋值
  • iOS小技巧之UIImagePickerController实现头像选择
  • JavaScript的使用你知道几种?(上)
  • jQuery(一)
  • JS学习笔记——闭包
  • Less 日常用法
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • Terraform入门 - 3. 变更基础设施
  • vue:响应原理
  • vue-loader 源码解析系列之 selector
  • WePY 在小程序性能调优上做出的探究
  • 从setTimeout-setInterval看JS线程
  • 从零搭建Koa2 Server
  • 回流、重绘及其优化
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 开源地图数据可视化库——mapnik
  • 如何设计一个比特币钱包服务
  • 详解NodeJs流之一
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • 正则与JS中的正则
  • zabbix3.2监控linux磁盘IO
  • ​Spring Boot 分片上传文件
  • # AI产品经理的自我修养:既懂用户,更懂技术!
  • #Datawhale AI夏令营第4期#AIGC方向 文生图 Task2
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • $nextTick的使用场景介绍
  • ()、[]、{}、(())、[[]]命令替换
  • (003)SlickEdit Unity的补全
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (LLM) 很笨
  • (pojstep1.3.1)1017(构造法模拟)
  • (动态规划)5. 最长回文子串 java解决
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (四)模仿学习-完成后台管理页面查询