一个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;
}