先来个官方实现
void* memcpy( void* dest, const void* src, std::size_t count )
{
assert(dest && src);
void* ret = dest;
while (count--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}
为避免溢出,目标参数和源参数所指向的数组的大小应至少为 num 个字节,并且不应重叠(对于重叠的内存块,memmove 是一种更安全的方法)。
函数memcpy从source的位置开始向后复制num个字节的数据到destinatation
这个函数在遇到 ‘\0’ 的时候并不会停下来。
如果source和destination有任何的重叠,复制的结果都是未定义的。
试想一想
当然,这里可以考虑倒过来拷贝,这样数据就不会丢失,是否可以用dest - src <count 来判断是否重合呢
#include <assert.h>
#include <string.h>
void* my_memcpy( void* dest, const void* src, size_t count )
{
// assert(dest && src);
void* ret = dest;
if(dest-src <count){
while (count--)
{
*(char*)(dest+count) = *(char*)(src+count);
}
}else{
while (count--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}
}
int main() {
char res[]="12345678";
my_memcpy(res+2,res+1,5);
return 0;
}