【C】memcpy memmove等内存操作函数

memcpy

  • void* memcpy ( void* destination, const void* source, size_t num );
  • 作用:按字节进行拷贝
  • 参数说明:
    • destination:目标数组
    • source:源数组
    • num:需要拷贝的字节数
  • 返回值:destination

官方说明:复制内存块
将num bytes的值从源指向的位置直接复制到目标指向的内存块。源指针和目标指针指向的对象的基本类型与此函数无关;结果是数据的二进制副本。函数不检查源中是否有任何终止的空字符-它总是精确地复制num字节。为了避免溢出,目标参数和源参数指向的数组大小至少应为num字节,并且不应重叠(对于重叠的内存块,memmove是一种更安全的方法)。

测试程序

	char *src = "hello!";
	char dst[10];
	memcpy(dst, src, strlen(src)+1);
	puts(dst);

output:
hello!

模拟实现memcpy

void * mymemcpy(void * destination, const void * source, size_t num){
    assert(destination);
    assert(source);
    void* copdst = destination;

    while (num){
        *(char*)destination = *(char*)source;
        destination = (char*)destination + 1;
        source = (char*)source + 1;
        num--;
    }
    return copdst;
}

memmove

  • void * memmove ( void * destination, const void * source, size_t num );
  • 作用:将num个字节的值从一个数组中拷贝到另一个数组中
  • 参数说明:
    • destination:目标数组
    • source:源数组
    • num:需要移动的字节数
  • 返回值:destination

官方说明:将num bytes的值从源指向的位置复制到目标指向的内存块。复制就像使用了中间缓冲区一样进行,允许目标和源重叠。源指针和目标指针指向的对象的基本类型与此函数无关;结果是数据的二进制副本。函数不检查源中是否有任何终止的空字符-它总是精确地复制num字节。为避免溢出,目标参数和源参数所指向的数组大小至少应为num字节。

测试程序

	char dst[30] = "destination";
	memmove(dst + 3, dst, strlen(dst));
	puts(dst);

output:
desdestination

模拟实现memmove

void * mymemmove(void * destination, const void * source, size_t num){
    assert(destination);
    assert(source);
    void *copydst = destination;

    if (destination <= source || (char *)destination >= ((char *)source + num)){
        while (num){
            *(char*)destination = *(char*)source;
            destination = (char*)destination + 1;
            source = (char*)source + 1;
            num--;
        }
    }
    else{
        destination = (char*)destination + num - 1;
        source = (char*)source + num - 1;
        while (num){
            *(char*)destination = *(char*)source;
            destination = (char*)destination - 1;
            source = (char*)source - 1;
            num--;
        }
    }
    return copydst;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值