首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

一个memcpy函数,大家看看有什么有关问题

2012-02-04 
一个memcpy函数,大家看看有什么问题void * memcpy(void *Dest, const void *src){if(NULL Dest || NULL

一个memcpy函数,大家看看有什么问题
void * memcpy(void *Dest, const void *src)
{
  if(NULL == Dest || NULL == src)return NULL;
  unsigned char *tmpDest;
  unsigned char *tmpSrc;
  tempDest = Dest;
  temSrc = src;
  while(src)
  {
  *tempDest = *tmpSrc;
  tempDest++;
  tempSrc++;
  }
  return tempDest;
}















[解决办法]
while(src) 

*tempDest = *tmpSrc; 
tempDest++; 
tempSrc++; 


内存为0是很正常的,你的就不行了。
如果从src+0开始一直是非零的数那就糟糕了除非遇到内存值为零,要不然Dest++将一直被src++赋值.

你这个只适用于c类型的字符串复制。
stl中有内存复制
#include <memory>
std::memcpy()
[解决办法]
内存拷贝不等同于字符串拷贝,不能够以内存字节为0作为结束标志(我猜想LZ的意思,因为while(src)这个循环是永远也不会停止的,while(*tmpSrc)才是以0字节为结束标记),而应该再加一个拷贝个数参数。
下面随手修改了一下代码(没做测试,不见得正确):

void * memcpy(void *dest, const void *src, int count) 

if(NULL == dest || NULL == src || count <= 0) 
return NULL; 
unsigned char *tmpDest = (unsigned char*)dest; 
unsigned char *tmpSrc = (unsigned char*)src; 
while(count --)
*tempDest ++ = *tmpSrc ++;
return dest; // return tmpDest是不正确的


[解决办法]
//这是HOSOFT中memcpy的一个实现,供参考
void *memcpy(void *s1, const void *s2, size_t n)
{

char *v;

v = (char*) s1;
while (n--)
{
*v++ = *(char*)s2;
s2 = (char*)s2 + 1;
}
return s1;
}
[解决办法]
IAR提供的memmove源码
void *memmove(void *s1, const void *s2, size_t n)
{
void *v;

v = s1;
if ( (char*)s2 <= (char*)s1 && ((char*)s2 + n) >= (char*)s1 )
{
s1 = (char*)s1 + n;
s2 = (char*)s2 + n;
while (n--)
{
s2 = (char*)s2 - 1;
s1 = (char*)s1 - 1;
*(char*)s1 = *(char*)s2;
}
}
else
{
while (n--)
{
*(char*)s1 = *(char*)s2;
s2 = (char*)s2 + 1;
s1 = (char*)s1 + 1;
}
}
return v;
}

热点排行