内存操作函数memcpy、memmove

本文介绍了如何模拟实现C语言中的memcpy与memmove函数。memcpy用于将源内存区域的内容复制到目标内存区域,但不处理重叠内存;memmove则可以处理重叠内存的情况。通过代码示例详细展示了两种函数的具体实现方式及其区别。

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

1.模拟实现memcpy

  函数memcpy与类型无关,按字节进行拷贝
  •函数memcpy从src的位置开始向后复制num个字节的数据到dest的内存位置
  •这个函数在遇到’\0’的时候并不会停下来
  •如果src和dest有任何的重叠,复制的结果都是未定义的
以下是模拟实现memcpy函数:

#include <stdio.h>
#include <windows.h>
#include <assert.h>

void *my_memcpy(void *dest,const void *src, int count)
{
    assert(dest);
    assert(src);
    assert(count > 0);
    char *p = (char *)dest;
    char *q = (char *)src;
    while (count--)
    {
        *p++ = *q++;
    }
    return dest;
}
int main()
{
    char arr[] = "abcdefg";
    char buff[10];
    my_memcpy(buff,arr,sizeof(arr));
    printf("buff = %s\n", buff);
    system("pause");
    return 0;
}

结果如下:

结果

2.模拟实现memmove

  •和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的
  •如果源空间和目标空间出现重叠,就得使用memmove函数处理
以下是模拟实现memmove函数:

#include <stdio.h>
#include <windows.h>
#include <assert.h>
#include <string.h>

void *my_memmove(void *dest,const void *src, int size)
{
    assert(dest);
    assert(src);
    //从右往左拷贝
    char *p = (char *)dest;
    char *q = (char *)src;
    if ((char *)dest > (char *)src && (char *)dest < (char *)src + size)
    {
        p = p + size - 1;      //指针指向最后一个元素
        q = q + size - 1;
        while (size--)
        {
            *p-- = *q--;
        }
    }
    //从左往右拷贝
    else
    {
        while (size--)
        {
            *p++ = *q++;
        }
    }
    return dest;
}
int main()
{
    char arr[20] = "abcdefg";
    my_memmove(arr + 1, arr, strlen(arr) + 1);
    printf("after arr = %s\n", arr);
    system("pause");
    return 0;
}

结果如下:

结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值