memcpy和memmove的区别

区别
  memcpy()和memmove()都是c语言的库函数,在头文件string.h
中,作用是拷贝一定长度内存的内容。它们唯一的区别是当内存发生局部重叠时,memmove可以保证拷贝正确,memcpy拷贝的结果是不确定的。


memcpy:
  原型:
这里写图片描述
作用是将src里面count个字节拷贝到dest中。

//memcpy内存拷贝(仅仅实现不相关的内存拷贝)
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
void *my_memcpy(void *dest, const void *src, size_t count)
{
    char *ret= (char *)dest;
    //拷贝count次
    while (count--)
    {
        *(char*)dest = *(char*)src;
        //字符型指针+1即跳过一个字符型(一个字节)
        dest = (char *)dest + 1;
        src = (char *)src + 1;
    }
    return ret;
}
int main()
{
    int a[10];
    int b[6] = {1,2,3};
    int i = 0;
    my_memcpy(a, b, 12);
    for (i = 0; i < sizeof(a) / sizeof(a[0]); i++)
    {
        printf("%d ", a[i]);
    }
    system("pause");
    return 0;
}

  由于数组a没有初始化,所有拷贝12个字节之后应为1,2,3,七个随机值。
运行:
这里写图片描述
这里写图片描述


memmove:
  原型:
这里写图片描述作用是将src里面count个字节拷贝到dest中。但是可以重复拷贝。
重复拷贝注意事项:

  1. 若dest > src
    这里写图片描述
  2. 若dest < src
    这里写图片描述
  3. 若不为重复拷贝
      从前向后拷贝或者从后向前拷贝不影响。
//任意内存的拷贝
#include<stdio.h>
#include<stdlib.h>
void *my_memmove(void * dest, const void *src, size_t count)
{
    char *ret = (char *)dest;
    if (src < dest)
    {
        ////从后往前
        while (count--)
        {
            *((char*)dest + count) = *((char*)src + count);
        }
    }
    else
    {
        //从前往后
        while (count--)
        {
            *(char*)dest = *(char*)src;
            dest = (char*)dest + 1;
            src = (char*)src + 1;
        }
    }
    return ret;
}
int main()
{
    int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    int i; 
    my_memmove(a + 3, a + 2, 16);
    for (i = 0; i < sizeof(a) / sizeof(a[0]); i++)
    {
        printf("%d ", a[i]);
    }
    system("pause");
    return 0;
}

由以上分析可得结果应为:1,2,3,3,4,5,6,8,9,10
运行:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/zhao_miao/article/details/82319093