-bash-3.2$ man memmove
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.
RETURN VALUE
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.
RETURN VALUE
The memmove() function returns a pointer to dest.
memmove内存拷贝函数,功能是拷贝n个字节到目标地址,目标内存和源地址内存可以重叠。
另外一个内存拷贝函数memcpy,不可以内存重叠。
memmove不是一个安全的函数,因此要注意拷贝时,有越界的产生。
一个长度n的数组,使用memmove向后移一位,最多能拷贝n-2个字节。
#include <stdio.h>
#include <string.h>
void func2()
{
char c[] = "1234567890";
printf("\nc[%s] strlen = %d\n",c,strlen(c));
memmove(c+1,c,sizeof(c)-2);//向后移动一位
printf("\nc[%s] len = %d\n",c, strlen(c));
memmove(c,c+1,sizeof(c)-1);//向前移动一位
printf("\nc[%s] len=%d \n",c,strlen(c));
}
int main()
{
func2();
return 0;
}
自己实现一个memmove函数。
void * memmove_my(void *dest, void *src, size_t n)
(1)源地址大于目的地址的情况下的拷贝
很明显有内存重叠,这种情形的拷贝需要顺序拷贝,可用从低地址到高地址进行拷贝。
(2)源地址小于的目的地址的情况下拷贝
很明显有内存重叠,这种情形的拷贝需要逆序拷贝,从高地址向低地址进行拷贝。
#include <stdio.h>
#include <stdio.h>
#include <string.h>
void *memmove_my(void *dest, void *src, size_t n);
void * memmove_my(void *dest, void *src, size_t n)
{
void *pTmp = NULL;
if(NULL == dest || NULL == src || n <= 0)
{
return NULL;
}
pTmp = dest;
if(src >= dest)
{
while(n > 0)
{
*(char *)dest++ = *(char *)src++;
n--;
}
}
else
{
while(n > 0)
{
*((char *)dest + n - 1) = *((char *)src + n -1);
n--;
}
}
return pTmp;
}
void func2(int i)
{
char c[] = "1234567890";
printf("\n func2 \n");
printf("\nc[%s] strlen = %d\n",c,strlen(c));
memmove(c+3,c,i);//向后移动一位
printf("\nc[%s] len = %d\n",c, strlen(c));
memmove(c,c+6,i);//向前移动一位
printf("\nc[%s] len=%d \n",c,strlen(c));
}
void func1(int i)
{
char c[] = "1234567890";
printf("\n func1 \n");
printf("\nc[%s] strlen = %d\n",c,strlen(c));
memmove_my(c+3,c,i);//向后移动一位
printf("\nc[%s] len = %d\n",c, strlen(c));
memmove_my(c,c+6,i);//向前移动一位
printf("\nc[%s] len=%d \n",c,strlen(c));
}
int main()
{
func2(4);
func1(4);
return 0;
}