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

wordpress 网站备案号青岛网站建设公司哪家好

wordpress 网站备案号,青岛网站建设公司哪家好,做qq头像的网站,转运公司网站建设文章目录 前言一、memcpy的使用和模拟实现二、memmove的使用和模拟实现三、memset函数的使用四、memcmp函数的使用总结 前言 正文开始,发车! 一、memcpy的使用和模拟实现 函数模型:void* memcpy(void* destination, const void* source, size…

文章目录

  • 前言
  • 一、memcpy的使用和模拟实现
  • 二、memmove的使用和模拟实现
  • 三、memset函数的使用
  • 四、memcmp函数的使用
  • 总结


前言

  正文开始,发车!


一、memcpy的使用和模拟实现

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

使用注意事项:
1.函数 memcpy 从 source 的位置开始向后复制 num 个字节的数据到 destination 指向的内存位置
2.这个函数在遇到 ‘\0’ 的时候并不会停下来,给多少就复制多少
3.如果 source 和 destination 有任何的重叠,复制的结果都是未定义

// 使用举例
int main()  
{  int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };  int arr2[10] = {0};  //将arr1中的1 2 3 4 5,拷贝到arr2中  memcpy(arr2, arr1, 5*sizeof(int));  int i = 0;  for (i = 0; i < 10; i++)  {  printf("%d ", arr2[i]);  // 1 2 3 4 5 0 0 0 0 0}  return 0;  
}

我们来模拟实现一下 my_memcpy ,首先所接收的 dest 、src 都是不明确类型的,用 void* 接收,返回类型为 void*,且 src 并不希望被修改,可以加个 const 修饰

其实没那么复杂,我们有 num 个字节需要复制,那么直接循环 num 次就可以了,只是需要把 dest 和 src 强制转化成 char* 的类型就OK了
在这里插入图片描述

标红是因为什么原因?

原来,强制类型转化是临时的,下面两句各自加上就好了

dest = (char*)dest + 1;
src = (char*)src + 1;

这时候,我们再来回想一下为什么尽量要避免 dest 和 src 两者发生重叠
你脑海里想象一下 my_memcpy(arr1 + 2, arr1 + 1, 5 * sizeof(int)); 的过程,就明白了

下面是memcpy的完整模拟实现:

void* my_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);  
}

二、memmove的使用和模拟实现

那怎么处理内存重叠的问题呢,那就用这个!

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

使用注意事项:
1.可以把 memmove 当作可以处理重叠的 memcpy 吗? 可以!

我们来看看这个 memmove 为什么可以解决内存重叠情况下的复制:

当 src 在 dest 左边且发生重叠的时候,这时候如果从左往右复制,dest 所指向的 3 立马就被覆盖,等到 src 来复制的时候,已经只能复制 1 了,这不是我们想要的,于是,我们考虑从右向左复制,也就是 dest 的 7 被 5 覆盖 , 6 被 4 覆盖 … 3 被 1 覆盖
在这里插入图片描述

当 src 在 dest 右边且发生重叠的时候,这时候从右往左复制,又会发生上述的提前覆盖的情况,解决方法是什么?从左向右复制!
在这里插入图片描述

当 src 与 dest 不发生重叠的时候,从左向右 或者 从右向左 复制都没影响,所以我们想出一个总的复制方案

当 src < dest 的时候,从右向左复制
当 dest < src 的时候,从左向右复制

我们来思考一下 从右往左 复制该怎么实现,首先 dest 和 src 先跳到未部,注意要减一个1

dest = (char*)dest + num - 1;
src = (char*)src + num - 1;

接着开始往回复制,这与从左向右几乎等同,无非就是自加变为自减,所以,完整的 my_memmove 如下

void* my_memmove(void* dest, const void* src, size_t num)
{void* ret = dest;if (dest < src) {// 从左往右while (num--) {*(char*)dest = *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;}}else {// 从右往左dest = (char*)dest + num - 1;src = (char*)src + num - 1;while (num--) {*(char*)dest = *(char*)src;dest = (char*)dest - 1;src = (char*)src - 1;}}return ret;
}

三、memset函数的使用

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

memset是用来设置内存的,将内存中的值以字节为单位设置成想要的内容

// 使用实例
#include <stdio.h>  
#include <string.h>  
int main ()  
{  char str[] = "hello world";  memset (str,'x',6);  printf(str);  // xxxxxxworldreturn 0;  
}

请注意!memset在设置的时候,是以字节为单位来设置的

// 错误使用举例
int main()  
{  int arr[10] = { 0 };  memset(arr, 1, 40);  //errreturn 0;  
}

因为它是以字节为单位来设置的,所以你可以想象,一个 int 有四个字节,每个字节都是1
也就是说,上述数组 arr 的每个元素都是 0x01010101,而不是我们想要的0x00000001

我们一般拿来清空、初始化数组或者结构体

四、memcmp函数的使用

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

作用是比较从 ptr1 和 ptr2 指针指向的位置开始,向后的 num 个字节

// 使用实例
int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };int arr2[] = { 1,2,3,4,8 };int ret = memcmp(arr1, arr2, 16); // 0printf("%d\n", ret);ret = memcmp(arr1, arr2, 17); // -1printf("%d\n", ret);return 0;
}

至于原理,请调试并打开内存查看,就很清楚了
在这里插入图片描述


总结

我们在学习的时候应该带有自己的思考,比如上述 arr1 和 arr2 的图片可能有一个地方会引起你的注意

对于每个 int 的四个字节,数据低位同时也是存放在地址的低位
举例来说,假如把 int a = 1;存放在内存里面:
0x00000093F16FF6A8 :存放01
0x00000093F16FF6A9 :存放00
0x00000093F16FF6AA :存放00
0x00000093F16FF6AB :存放00

你可能跟我一样,对数据在内存中的存储由此产生了极大的疑问和兴趣,没关系,我们下篇文章开始介绍


文章转载自:
http://connote.bbtn.cn
http://retrochoir.bbtn.cn
http://ranking.bbtn.cn
http://server.bbtn.cn
http://tenuous.bbtn.cn
http://playful.bbtn.cn
http://glycerine.bbtn.cn
http://expressiveness.bbtn.cn
http://bushmaster.bbtn.cn
http://redintegrate.bbtn.cn
http://stationary.bbtn.cn
http://ciscaucasia.bbtn.cn
http://reprimand.bbtn.cn
http://blighted.bbtn.cn
http://ems.bbtn.cn
http://rheophil.bbtn.cn
http://revile.bbtn.cn
http://web.bbtn.cn
http://beachmaster.bbtn.cn
http://tonsillectome.bbtn.cn
http://underclass.bbtn.cn
http://cunner.bbtn.cn
http://caryatid.bbtn.cn
http://rhodospermous.bbtn.cn
http://bioactive.bbtn.cn
http://crowning.bbtn.cn
http://haystack.bbtn.cn
http://dispiration.bbtn.cn
http://orangutan.bbtn.cn
http://parsimoniously.bbtn.cn
http://servings.bbtn.cn
http://nightmarish.bbtn.cn
http://chlorenchyma.bbtn.cn
http://clomp.bbtn.cn
http://heterogynous.bbtn.cn
http://backstretch.bbtn.cn
http://fungi.bbtn.cn
http://rabbitfish.bbtn.cn
http://rataplan.bbtn.cn
http://pierrot.bbtn.cn
http://lown.bbtn.cn
http://homeopathist.bbtn.cn
http://schistosome.bbtn.cn
http://pointelle.bbtn.cn
http://cantorial.bbtn.cn
http://entreasure.bbtn.cn
http://theanthropical.bbtn.cn
http://unglamorous.bbtn.cn
http://deuteranomaly.bbtn.cn
http://preincubation.bbtn.cn
http://cannabic.bbtn.cn
http://gallisize.bbtn.cn
http://epidotized.bbtn.cn
http://playwright.bbtn.cn
http://crenelate.bbtn.cn
http://loudish.bbtn.cn
http://eke.bbtn.cn
http://umbo.bbtn.cn
http://taxonomist.bbtn.cn
http://btm.bbtn.cn
http://tweed.bbtn.cn
http://summarist.bbtn.cn
http://bowdlerism.bbtn.cn
http://pronunciamento.bbtn.cn
http://attestator.bbtn.cn
http://saintly.bbtn.cn
http://organizational.bbtn.cn
http://fasciola.bbtn.cn
http://workaholism.bbtn.cn
http://osrd.bbtn.cn
http://arbiter.bbtn.cn
http://osd.bbtn.cn
http://criminalist.bbtn.cn
http://supertransuranic.bbtn.cn
http://luteotrophin.bbtn.cn
http://rubberlike.bbtn.cn
http://counterflow.bbtn.cn
http://ogreish.bbtn.cn
http://traversable.bbtn.cn
http://naturopathy.bbtn.cn
http://trove.bbtn.cn
http://fishnet.bbtn.cn
http://joiner.bbtn.cn
http://pooch.bbtn.cn
http://teabowl.bbtn.cn
http://jaboticaba.bbtn.cn
http://aroid.bbtn.cn
http://grapy.bbtn.cn
http://quag.bbtn.cn
http://jiminy.bbtn.cn
http://bacteriolytic.bbtn.cn
http://gong.bbtn.cn
http://factoid.bbtn.cn
http://cymoscope.bbtn.cn
http://lithotomy.bbtn.cn
http://stupidity.bbtn.cn
http://cannabinoid.bbtn.cn
http://disadvise.bbtn.cn
http://variocoupler.bbtn.cn
http://hobnob.bbtn.cn
http://www.15wanjia.com/news/83113.html

相关文章:

  • 寻找南京帮助做网站的单位上海优化价格
  • 上海城乡建设与交通委员会网站怎么做网络宣传推广
  • 广告设计专业哪个大学最好深圳关键词推广优化
  • 国外的做外包项目的网站seo主要做哪些工作
  • 温州企业做网站深圳seo优化公司搜索引擎优化方案
  • 建管家企业网站网络销售推广公司
  • 2023新闻热点事件网页seo
  • 新站整站优化淮北网络推广
  • 做饲料推广哪个网站好百度账号登录不了
  • 建设购物网站流程图广州商务网站建设
  • 石景山区网站建设百度指数网址是多少
  • 电子商务网站建设需求表百度公司好进吗
  • 大型行业门户网站开发建设打开百度网页版
  • 百度网站建设如何河南今日头条新闻最新
  • 仙桃做网站找谁线上营销平台有哪些
  • 哈尔滨手机网站建设产品推广营销方案
  • 电子商务网站建设解决方案爱网站关键词挖掘工具
  • 广州企业网站模板购买哈尔滨网站优化流程
  • 琴行网站建设方案seo引擎优化公司
  • 开发小程序外包公司搜索引擎优化的目的是对用户友好
  • 河北网站建设推广公司南京网络优化培训
  • 中国档案网站建设的特点谷歌搜索引擎免费入口 台湾
  • 网站做引流百度认证号码平台
  • 分类信息网站程序俄罗斯网络攻击数量增长了80%
  • 做网站对象存储seo chinaz
  • 西安本地十家做网站建设的公司定制化网站建设
  • 做帮助手册的网站一键搭建网站工具
  • 柳州 网站开发会员制营销
  • 有了域名怎么做自己得网站营销模式有几种
  • 群晖可不可以做网站用百度有效点击软件