博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
memcpy内存重叠的解决
阅读量:6275 次
发布时间:2019-06-22

本文共 1852 字,大约阅读时间需要 6 分钟。

内存重叠:拷贝的目的地址在源地址范围内。所谓内存重叠就是拷贝的目的地址和源地址有重叠。

在函数strcpy和函数memcpy都没有对内存重叠做处理的,使用这两个函数的时候只有程序员自己保证源地址和目标地址不重叠,或者使用memmove函数进行内存拷贝。

memmove函数对内存重叠做了处理。

现在来看函数strcpy

原型:extern char *strcpy(char *dest,char *source);

功能:把source所指由NULL结束的字符串复制到dest所指的数组中。

说明:source和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳source的字符串。

返回指向dest的指针。

重叠从两方面考虑:

(1).dest数据覆盖了source; 如:dest(8byte) 地址:1000

source(8byte) 地址:1002

(2).dest所指的区域本来就是source的一部分; 如:dest(8byte) 地址:1000

source(8byte) 地址:0998

例如:针对第一种交叉情况情况,dst<src且dst+count>src,memcpy和memmove的结果是一样的。请看下面的例子讲解:

string s = "hello world";

memmove(&s[0],&s[5],10);

举个内存重叠环境的例子:

int main()

{char *p = NULL;

p=(char*)malloc(100);

memcpy(p,"123456789",strlen("123456789")); //会等到错误的结果,有一个长度参数,只能拷贝cnt个

//字节就结束了

printf("before p =%s\n",p);

strcpy(p+1,p); //注意:这里重叠了,而strcpy是根据判断原串中的'\0'

printf("after p =%s\n",p);

free(p);

}

1.下面来看strcpy()原型写法: 字符串拷贝.

char *strcpy(char *strDest, const char *strSrc)
{
assert((strDest!=NULL) && (strSrc !=NULL));
char *address = strDest;
while( (*strDest++ = * strSrc++)·1 != '/0')
NULL ;
return address ;
}

2.下面来看下memcpy函数的原型写法:内存拷贝

void *memcpy(void *dest, const void *source, size_t count)

{
assert((NULL != dest) && (NULL != source));

char *tmp_dest = (char *)dest;

char *tmp_source = (char *)source;
while(count --)//不对是否存在重叠区域进行判断
*tmp_dest ++ = *tmp_source ++;
return dest;
}

3.下面来看下memmove函数的原型写法:

void *memmove(void *dest, const void *source, size_t count)

{
assert((NULL != dest) && (NULL != source));
char *tmp_source, *tmp_dest;
tmp_source = (char *)source;
tmp_dest = (char *)dest;
if((dest + count<source) || (source + count) <dest))
{// 如果没有重叠区域
while(count--)
*tmp_dest++ = *tmp_source++;
}
else
{ //如果有重叠(反向拷贝)
tmp_source += count - 1;
tmp_dest += count - 1;
while(count--)
*--tmp_dest = *--tmp;
}
return dest;
}

更多内容见:

转载于:https://www.cnblogs.com/wangicter/archive/2012/08/31/4767300.html

你可能感兴趣的文章
Android MPAndroidChart:动态添加统计数据线【8】
查看>>
第五届全球游戏开发者大会暨天府奖盛典18日盛大开幕
查看>>
融了1000万,只为让它们好好吃饭!
查看>>
Debian 项目领导人职位已有三位侯选者
查看>>
阿里巴巴与三个知名车企达成合作,将为其“AI+车”解决方案
查看>>
django小项目:搭建简易火车车票预订系统
查看>>
仅研发就投入3300人 华为如何掘金物联网?
查看>>
表单调试工具推荐
查看>>
Kubernetes node的防火墙问题导致pod ip无法访问
查看>>
hdfs-site.xml配置
查看>>
为什么多线程读写 shared_ptr 要加锁?
查看>>
netware 6.5的故障解决
查看>>
linux 同步IO: sync、fsync与fdatasync
查看>>
笼络人才,再三“表白”,库克表示苹果更看重AR
查看>>
[原创]对于运行ASP.NET程序时,提示:无法启动程序“http://localhost:3532/Default.aspx”。的疑问...
查看>>
潮鞋的AR初体验,鬼冢虎和Anrealage合作新鞋
查看>>
4星|《错误的行为》:经济行为中大部分时候人们是不理性的
查看>>
java中包容易出现的错误及权限问题
查看>>
Hibernate5-查询与排序
查看>>
硬盘速度测试
查看>>