memmove的用法及实现

-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

       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;
}






  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值