您好,欢迎来到伴沃教育。
搜索
您的当前位置:首页内存重叠以及memcpy和memmove函数详解

内存重叠以及memcpy和memmove函数详解

来源:伴沃教育

内存重叠

首先,先介绍一下memcpy和memmove函数

memcpy和memmove函数

void *memcpy( void *dest, const void *src, size_t count );
void *memmove( void* dest, const void* src, size_t count );
  • memcpy和memmove函数都是用于从src拷贝count个字节到dest。
  • 但是,如果目标区域和源区域有重叠的话: memcpy不能够确保源串所在重叠区域在拷贝之前被覆盖,并且memcpy会出现错误。memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,复制后src内容会被更改, 当目标区域与源区域没有重叠则和memcpy函数功能相同。

memmove的处理措施:

接下来,借助于memcpy函数来说明内存重叠

情况一:

  • 这时,不会造成内存重叠,直接从左到右进行拷贝即可

情况二:

情况三:

解决:

  • 如果存在内存重叠,就从高地址进行拷贝
  • 自己实现的memcpy如下:
char *my_memcpy(char *dst, const char* src, int cnt)
{
	 assert(dst != NULL && src != NULL);
	 char *ret = dst;
	 /*内存᯿叠,从⾼地址开始复制*/
	 if (dst >= src && dst <= src+cnt-1)
	 {
		 dst = dst+cnt-1;
		 src = src+cnt-1;
		 while (cnt--)
		 {
			 *dst-- = *src--;
		 }
	 } 
	 else //正常情况,从低地址开始复制
	 {
		  while (cnt--)
		 {
			 *dst++ = *src++;
		 }
     }
	 return ret;
}

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- bangwoyixia.com 版权所有 湘ICP备2023022004号-2

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务