memmove函数实现——string.h库函数

本文详细介绍了memmove函数的功能和用法,包括其参数说明、返回值及如何在内存区域重叠的情况下正确复制数据。提供了两种不同的实现方式,并对比了与memcpy的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


函数实现:


信息来自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;
}

=============文章结束==============
小菜总结,如有不当,欢迎批评!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值