伪IT男
分类: 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有重叠时是怎么处理的