c语言| |memcpy函数与memmove函数

会有一股神秘感。 提交于 2019-12-07 09:18:16

memcpy和memmove函数


memcpy函数


1.源函数


void *memcpy(void *dest, const void *src, size_t n)

2.作用

(小编自己的理解)内存拷贝。从src内存空间移动n个元素,将其赋值给dest的内存中,从内存中第一个地址所指向的数据开始赋值,直到赋值n个数据,该函数调用结束,同时返回dest,即返回被赋值的内存的起始位置。返回dest的意义是可是增加链接属性。

memcpy函数实现:(my_memcpy)原谅小编没有找到源代码

#include <assert.h> //包含assert函数的头文件
#define my_type int //自己定义要进行内存赋值的数据类型

my_type *my_memcpy(my_table *dest, const my_type *src, size_t n)
{
    my_type *start = dest; //用于返回dest的初始地址,使该函数具有链接属性
    assert(dest != NULL); //断言dest与src不是空地址
    assert(src != NULL);    
    while (n--)
    {
        *dest++ = *src++;
    }
    return start;
}

不了解assert函数的同学们,可以戳一戳assert了解一下哦!


memmove函数

1.源函数


void *memmove(void *dest, const void *src, size_t n)

2.作用

(小编自己的理解)内存拷贝。基本功能与memcpy函数一致。不一样的地方在于,若是目标区域与源区域有重叠的部分的话,可以在源区域未被目标区域覆盖的时候,将其拷贝到目标区域当中。从而实现内存拷贝的功能。

memmove函数的实现:(my_memmove)原谅小编没有找到源代码


#include <assert.h> //包含assert函数的头文件
#define my_type int //自己定义要进行内存赋值的数据类型

my_type *my_memmove(my_table *dest, const my_type *src, size_t n)
{
    my_type *start = dest; //用于返回dest的初始地址,使该函数具有链接属性
    assert(dest != NULL); //断言dest与src不是空地址
    assert(src != NULL);    
    while (n)
    {
        *(dest + n - 1) = *(src + n -1); //从最后一个要拷贝的内存开始拷贝依次先前拷贝
        n--;
    }
    return start;
}

对比

1.memcpy函数与memmove函数进行对比

  • memcpy函数对于处理内存不重叠的情况,memmove函数可以处理内存重叠的情况

分情况:

<1> 内存不重叠

<2>内存重叠,(src < dest)只能使用memmove函数

<3>内存重叠,(dest < src)可以使用memcpy函数

  • 原理区别

原理:memcpy函数是从左边一个一个的将src中的值拷贝到dest中,而memmove函数是既可以从左边开始拷贝又可以从右边开始拷贝的。所以对于memcpy函数只有<1><3>情况可以使用,而对于<2>情况则会出现问题。而memmove函数拷贝的就不会出现错误。

memcpy的错误:会将第一个和第二个拷贝过去的最后再拷贝到最后的第一个和第二个上。就会出现错误。

2.内存拷贝函数与字符串拷贝函数的对比

  • 使用的类型不同,strcpy函数只对字符串进行操作;memmove函数和memcpy函数对所有类型都适用,为内存拷贝

  • strcpy函数以’\0’为拷贝的结束条件;而memmove函数和memcpy函数则是以第三个参数num进行控制拷贝

如有不足:请告诉小凯,会及时更新与修改的,谢谢大家

如果对github感兴趣可以到我的github中看一下

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!