memcpy内存重叠的解决
内存重叠:拷贝的目的地址在源地址范围内。所谓内存重叠就是拷贝的目的地址和源地址有重叠。
在函数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;
}
更多内容见: http://blog.csdn.net/feitianxuxue/article/details/7195158
memcpy内存重叠的解决相关推荐
- memcpy内存重叠问题
memcpy内存重叠 之前一直没有注意到内存复制函数的内存重叠问题.今天偶遇遂琢磨了一下,记之. 函数简介:c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始 ...
- 从memcpy到memmove,内存函数拷贝与内存重叠问题(重点内容)
有一个关于拷贝的问题,假如有这样一个字符串 char a[]="hello"; 我需要把这个字符串拷进另一个变量中 char a1[10]; 好像方法蛮多的,比如strcpy #d ...
- 函数 —— strncpy() (内存重叠) memcpy() memmove() 一个字符串拷贝给另一个字符串
char *strncpy(char *dest, const char *src, size_t n) *strncpy(char *dest, const char *src, size_t n) ...
- memcpy和memmove的区别以及内存重叠问题
memcpy和memmove的区别以及内存重叠问题 转自:https://www.codecomeon.com/posts/89/ 区别 memcpy() 和 memmove() 都是C语言中的库函数 ...
- 内存重叠的拷贝--memmove
1.memmove要解决的问题 strcpy只能拷贝字符串,为了解决这一问题,则有了memcpy这一函数.但是针对重叠内存的拷贝,memcpy最初并不能解决这一问题(后期优化过的memcpy能够实现重 ...
- 对内存重叠的深入认识
内存重叠:拷贝的目的地址在源地址范围内.所谓内存重叠就是拷贝的目的地址和源地址有重叠. 在函数strcpy和函数memcpy都没有对内存重叠做处理的,使用这两个函数的时候只有程序员自己保证源地址和目标 ...
- memcpy 内存越界分析
memcpy 内存越界 本文主要分析memcpy为什么会导致内存越界,在什么场景下会导致越界,为什么memcpy越界之后并没有必现coredump memcpy 源码 void *memcpy(voi ...
- 模拟内存计算如何解决边缘人工智能推理的功耗挑战
模拟内存计算如何解决边缘人工智能推理的功耗挑战 How analog in-memory computing can solve power challenges of edge AI inferen ...
- memcpy()内存拷贝和赋值操作效率测试
比较memcpy()内存拷贝和"="赋值操作效率,测试代码如下 #include <stdio.h> #include <malloc.h> #includ ...
最新文章
- 开始升级我的工作流系统
- 【转】linux tar 压缩
- 生成随机密码的十种方法
- 我是如何面试别人List相关知识的
- php5.4与php5.2,升级php 5.2.14 到5.4.11版本报错问题
- Python | 7招教你识别一个网站是否是Django后台
- “码农”被黑得最惨的一次,深夜下班被误认为小偷
- Docker的网络配置:创建网桥
- NGN学习笔记6——NGN的业务提供技术
- Windows和Mac系统上常用的MySQL客户端工具
- 聊聊如何对员工做绩效考核
- 简历中“项目经历“该如何写?
- 奥特曼系列ol星球破坏是哪个服务器,奥特曼里的“六大星球毁灭者”,每个都是轻松毁灭星球的存在...
- 探索 AIX 6:新特性概述(上)(转自IBM)
- SAP中使用SE91更改消息短文本
- epub 格式转换成 mobi
- 动手实践,使用div盒子模型设计一个播放器效果/动手实践
- 解决bug-python中关于Process finished with exit code -1073740791
- 工欲善其事,必先利其器之—利用网上在线工具—多个地点Ping服务器以检测服务器响应情况
- 【读书推荐】中国是部金融史