模拟实现C库的memmove和memcpy
程序员文章站
2022-06-08 19:13:09
...
memmove和memcpy是做什么的?
memcpy和memmove()都是C语言中的库函数,在头文件string.h中,作用是拷贝一定长度的内存的内容。
他们的作用是一样的,唯一的区别是,当内存发生局部重叠的时候,memmove保证拷贝的结果是正确的,memcpy不保证拷贝的结果的正确。
memcpy
void *memcpy(void *dst, const void *src, size_t count);
memcpy()函数从src内存中拷贝n个字节到dest内存区域,但是源和目的的内存区域不能重叠。
memcpy()函数返回指向dest的指针
memmove
void *memmove(void *dst, const void *src, size_t count);
memmove() 函数从src内存中拷贝n个字节到dest内存区域,但是源和目的的内存可以重叠。
memmove函数返回一个指向dest的指针。
memmove与memcpy出现内存重叠问题
第一种情况下,拷贝重叠的区域不会出现问题,内容可以正确的被拷贝。
第二种情况下,问题出现在右边的两个字节,这两个字节的原来的内容首先就被覆盖了,而且没有保存。所以接下来拷贝的时候,拷贝的是已经被覆盖的内容,这是有问题的。
实际上,memcpy只是memmove的一个子集。
模拟实现memcpy与memmove
void *my_memcpy (void * dest,const void * src,int count)
{
void *ret = dest;
assert(dest != NULL);
assert(src != NULL);
while (count )
{
*(( char*)dest ) = *((char*) src);
dest = (char *)dest+1;
src = (char *)src+1;
count--;
}
return ret ;
}
void* my_memmove (void * dest, void *src, int sz )
{
char *sp = dest;
assert(dest );
assert(src );
//这里为了防止拷贝错误做了判断
//如果目标空间大于源空间并且会出现重叠,这时需要从后向前拷贝,这样不会出现错误。
if (dest > src && ( char *)dest < (char *) src+sz )
{
while (sz --)
{
*(( char *)dest +sz) = *(( char*)src +sz);
}
}
//否则,从前向后一个一个拷贝即可。
else
{
while (sz --)
{
*(( char *)dest ) = *((char*) src);
dest = (char *)dest+1;
src = (char *)src+1;
}
}
return sp ;
}
上一篇: 【C】库函数之sqrt
下一篇: mysql 中的any_value 函数
推荐阅读
-
C#实现的三种模拟自动登录和提交POST信息的方法
-
第 16 章 C 预处理器和 C 库(string.h 库中的 memcpy() 和 memmove())
-
c语言使用librdkafka库实现kafka生产和消费的实例
-
用c语言.模拟实现strcpy,strcat,strcat,memcpy,memmove
-
模拟实现C库的memmove和memcpy
-
Android JNI实现Java与C/C++互相调用,以及so库的生成和调用(JNI方式调用美图秀秀so)
-
C语言模拟实现memcpy,memmove函数
-
C#实现的三种模拟自动登录和提交POST信息的方法
-
第 16 章 C 预处理器和 C 库(string.h 库中的 memcpy() 和 memmove())
-
c语言使用librdkafka库实现kafka生产和消费的实例