浅谈memcpy和memmove
POSIX和C标准明确表示,使用重叠区域的mem‐cpy()会产生未定义的行为。
memcpy和memmove的区别是:当内存发生局部重叠时memmove函数能够保证拷贝结果的正确性,而memcpy则不能保证拷贝结果的正确性;当内存没有发生重叠的时候两个函数的结果是一样的。
为什么说memcpy不能保证拷贝结果的正确性,可以看看下面这个例子。
当src和dst重合(即内存重叠)且src小于dst且dst < src+count时,如下图所示:
如果从低地址开始拷贝,那么源数据在使用前会被覆盖。除了这种情况,其他情况下都可以保证memcpy拷贝正确。
为什么memmove可以保证拷贝的结果是正确的?
因为memmove是在memcpy的基础上对所有可能的情况都做了处理;简单的说就是在内存重叠且源数据会被覆盖的情况下选择从高地址开始拷贝,而其他情况下选择从低地址开始拷贝。
下面是我自己写的一个memmove实现函数:
void *my_memmove(void *dst, const void *src, int count)
{
if(NULL == dst || NULL == src || count <= 0)
{
return NULL;
}