函数作用及差别
memcpy
void * memcpy( void * destination, const void * source ,size_t num);
1.函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。
2.这个函数在遇到’\0’的时候并不会停下来
3.如果source和destination有任何的重叠,复制的结果都是未定义的
memmove
void * memmove( void * destination, const void * source ,size_t num);
和memcpy的作用是一样的
唯一的区别是,当内存发生局部重叠的时候,memmove保证拷贝的结果是正确的,memcpy不保证拷贝的结果的正确。
第一种情况下,拷贝重叠的区域不会出现问题,内容均可以正确的被拷贝。
第二种情况下,问题出现在右边的两个字节,这两个字节的原来的内容首先就被覆盖了,而且没有保存。所以接下来拷贝的时候,拷贝的是已经被覆盖的内容,显然这是有问题的。
实际上,memcpy只是memmove的一个子集。
memcpy的模拟实现
void* my_memcpy(void* dst, const void* src, int num)
{
assert(dst);
assert(src);
char* _dst = (char*)dst;
const char* _src = (char*)src;
//left->right
while (num) {
*_dst = *_src;/从左往右拷贝
_dst++;
_src++;
num--;
}
return dst;
}
memmove的模拟实现
void* my_memmove(void* dst, const void* src, int num)
{
assert(dst);
assert(src);
char* _dst = (char*)dst;
const char* _src = (char*)src;
if (_dst > _src && _dst < _src + num) {
// right->left拷贝
_dst = _dst + num - 1;
_src = _src + num - 1;
while (num) {
*_dst = *_src;
_dst--;
_src--;
num--;
}
}
else {
//left->right拷贝
while (num) {
*_dst = *_src;
_dst++;
_src++;
num--;
}
}
return dst;
}