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

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

1.strcpy函数

详细参考:http://www.cnblogs.com/chenyg32/p/3739564.html

详细参考:http://blog.chinaunix.net/uid-26495963-id-3080058.html

已知strcpy函数的原型是:

char *strcpy(char *dst, const char *src);实现strcpy函数解释为什么要返回char *假如考虑dst和src内存重叠的情况,strcpy该怎么实现

 2.strcpy函数的形式

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

3.memcpy函数的微软实现

void * __cdecl memcpy (void * dst,const void * src, size_t count )   {       void * ret = dst;  #if defined (_M_MRX000) || defined (_M_ALPHA) || defined (_M_PPC)                {                   extern void RtlMoveMemory( void *, const void *, size_t count );          RtlMoveMemory( dst, src, count );      }  #else  /* defined (_M_MRX000) || defined (_M_ALPHA) || defined (_M_PPC) */                /*          * copy from lower addresses to higher addresses          */              while (count--) {           *(char *)dst = *(char *)src;          dst = (char *)dst + 1;           src = (char *)src + 1;      }  #endif  /* defined (_M_MRX000) || defined (_M_ALPHA) || defined (_M_PPC) */               return(ret);  }

4.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(tmp_source<=tmp_dest&&tmp_source+count>=tmp_dest)  {   tmp_source += count - 1;   tmp_dest += count - 1;   while(count--)    *tmp_dest-- = *tmp_source--;  }  else  {   while (count--)   {    *tmp_dest++=*tmp_source++;   }  }   return tmp_dest; }

4. 举例解释上边几个函数的不同

 dst>=src

 

src+cnt>=dst

第一种情况下,拷贝重叠的区域不会出现问题,内容均可以正确的被拷贝。

第二种情况下,问题出现在右边的两个字节,这两个字节的原来的内容首先就被覆盖了而且没有保存。所以接下来拷贝的时候,拷贝的是已经被覆盖的内容,显然这是有问题的。

 举例

#include 
#include
int main(void){char s[]="123456789";char d[]="123";strcpy(d,s);printf("%s,\n%s",d,s);return 0}

key :以上程序的结果为:123456789,56789

cause:至于原因,应该是当初分配的内存地址是连续内存的问题,原来是1234\0123456789\0,strcpy后变成了123456789\06789\0

转载于:https://www.cnblogs.com/lwflourish/p/4775847.html

你可能感兴趣的文章
字典dict
查看>>
squid-正向代理
查看>>
《A First Course in Probability》-chaper7-极限定理-强大数定理
查看>>
Python类型转换+序列操作+基本概念辨析速查手册
查看>>
Python编程之数据结构与算法练习_010
查看>>
vi 常用技巧
查看>>
Android基于TrafficStats实现流量实时监测
查看>>
《微店大数据开发平台架构演进》阅读有感
查看>>
Gym - 101670G Ice cream samples(CTU Open Contest 2017 尺取法)
查看>>
Configure Theano in Windows 8.1 x64
查看>>
win7下安装配置nodejs、使用npm安装express
查看>>
DB2某建表语句
查看>>
Android开发之Fragment的替换显示反复创建问题
查看>>
Hive修改表
查看>>
Sun JVM 内存模型及垃圾回收策略
查看>>
第3周实践项目7 删除链表元素最大值
查看>>
洛谷2408不同字串个数/SPOJ 694/705 (后缀数组SA)
查看>>
s12-day03-work01 python修改haproxy配置文件(初级版本)
查看>>
html5 聊天 宿舍 宿舍列表
查看>>
音乐的作曲形式
查看>>