函数实现:
信息来自RHEL,man page:
MEMMOVE(3) Linux Programmer's Manual MEMMOVE(3)
NAME
memmove - copy memory area
SYNOPSIS
#include <string.h>
void *memmove(void *dest, const void *src, size_t n);
DESCRIPTION
The memmove() function copies n bytes from memory area src to memory
area dest. The memory areas may overlap: copying takes place as though
the bytes in src are first copied into a temporary array that does not
overlap src or dest, and the bytes are then copied from the temporary
array to dest.
RETURN VALUE
The memmove() function returns a pointer to dest.
memmove()函数实现:
0.函数原型:
#include <string.h>
void *memmove(void *dest, const void *src, size_t n);;
1.参数:
src:指向源内存指针。
dest:指向目标内存指针。
n:拷贝字节数
2.返回值:
返回一个目标内存区的指针dest
3.功能描述:
memmove函数将src指针指向的内存区的前n个字节数据拷贝到dest指向的内存区内。src和dest指向内存区可以重叠,memmove可以保证拷贝的正确性。
memmove()函数同memcpy和memccpy函数(传送门:http://blog.youkuaiyun.com/riyadh_linux/article/details/50153907)一样,都是将一段内存中的内容拷贝到指定地址中。
他们的区别在于:当新旧内存存在重叠时,memmove可以保证拷贝结果的正确性,而memcpy则不保证
拷贝结果的正确性
。如果目标区域和源区域有重叠的话,
memmove
能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中
。memcpy在效率上高于memmove函数,如果
你自己可以确定两内存不会重叠
的话,你可以使用memcpy,否则还是使用memmove函数
4.实现:
实现一:
void *my_memmove1(void *dest, const void *src, size_t n)
{
char *dest_func = (char *)dest;
char *src_func = (char *)src ;
int i = 0 ;
char temp[n] ; //临时数组存储源内存数据
//参数判断
if(NULL == dest_func || NULL == src_func || 0 > n){
fprintf(stderr, "error\n");
return NULL;
}
//先将源内存中数据拷贝到临时数组中,再将林时数组中数据拷贝到目标内存中
for(i = 0; i < n; ++i){
temp[i] = src_func[i];
}
for(i = 0; i < n; ++i){
dest_func[i] = temp[i];
}
return dest;
}
实现二:
void *my_memmove2(void *dest, const void *src, size_t n)
{
char *dest_func = (char *)dest;
char *src_func = (char *)src ;
//参数判断
if(NULL == dest_func || NULL == src_func || 0 > n){
fprintf(stderr, "error\n");
return dest;
}
//先判断是否存在重叠内存
if(dest_func <= src_func || dest_func >= (src_func + n)){
while(n--){
*dest_func++ = *src_func++;
}
}else{
dest_func = dest_func + n - 1;
src_func = src_func + n - 1;
while(n--){
*dest_func-- = *src_func--;
}
}
return dest;
}
=============文章结束==============
小菜总结,如有不当,欢迎批评!