Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2101460
  • 博文数量: 454
  • 博客积分: 10921
  • 博客等级: 上将
  • 技术积分: 5396
  • 用 户 组: 普通用户
  • 注册时间: 2006-06-15 15:20
个人简介

伪IT男

文章分类

全部博文(454)

文章存档

2016年(2)

2013年(6)

2012年(17)

2011年(29)

2010年(24)

2009年(54)

2008年(53)

2007年(202)

2006年(67)

分类: C/C++

2006-12-14 22:30:05

写了一段代码:准备使用memcpy或memmove实现对删除一个指针内部元素的处理

{

    CString *tmpstr=new CString[4];

    for(int i=0;i<4;i++)
    tmpstr[i].Format("%d",i);
    memcpy(tmpstr,tmpstr+1,2*sizeof(CString));
    tmpstr[2]="gg";
    return;

}

本来期望的结果是tmpstr={"1‘,“2”,“gg”,“3’}

但实际上却是:tmpstr={"1‘,“gg”,“gg”,“3’}

即,在source和destination重叠时,tmpstr[2],tmpstr[3]指向了同一地址使用memmove也得到同样的结果

在这种情况下,只好采取迂回战术,采用一个中间指针,先将需要转移的部分拷贝到那个指针中去,将原指针置空,然后再拷贝回来。

{

    CString *tmpstr=new CString[4];

    CString *tmpstr1=new CString[4];

    for(int i=0;i<4;i++)tmpstr[i].Format("%d",i);

    memcpy(tmpstr1,tmpstr+1,2*sizeof(CString));

    memcpy(tmpstr1,tmpstr+3,sizeof(CString));

    tmpstr=NULL;
    memcpy(tmpstr,tmpstr1,4*sizeof(CString));
    tmpstr[2]="gg";
    return;

}

总之,就是源地址和目标地址最好不要重叠,否则就要小心处理。

 

 

在baidu上搜索到的相关资料是:

memcpy在source和destination有重叠时是怎么处理的

memcpy不做任何处理。memcpy本来就是不考虑区域重叠的。  
   
   
  memmove考虑重叠。重叠通常就是三种情况,一是目标区域的首地址落在源区域内;二是目标区域的尾地址落在源区域内;三是两个区域完全重叠。  
   
  从结果上来看,只有第一种情况才有可能发生与预期不相同的结果。这时候memmove通常使用反方向复制的方法,从源区域的尾地址开始复制,这样就能避免出现已复制的数据被后续复制覆盖的错误
阅读(2054) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~