memcpy()和memmove() 函数的介绍

原创 2013年12月04日 14:11:26
 
memcpy和memmove()都是C语言中的库函数,在头文件string.h中,作用是拷贝一定长度的内存的内容,原型分别如下:
void *memcpy(void *dst, const void *src, size_t count);

void *memmove(void *dst, const void *src, size_t count);

他们的作用是一样的,唯一的区别是,当内存发生局部重叠的时候,memmove保证拷贝的结果是正确的,memcpy不保证拷贝的结果的正确。


第一种情况下,拷贝重叠的区域不会出现问题,内容均可以正确的被拷贝。
第二种情况下,问题出现在
右边的两个字节,这两个字节的原来的内容首先就被覆盖了而且没有保存。所以接下来拷贝的时候,拷贝的是已经被覆盖的内容,显然这是有问题的。
实际上,
memcpy只是memmove的一个子集

二者的c语言实现很简单,有兴趣的朋友可以去看看。在实际情况下,这两个函数都是用汇编实现的。

memmove在copy两个有重叠区域的内存时可以保证copy的正确,而memcopy就不行了,
但memcopy比memmove的速度要快一些,如:
char s[] = "1234567890";
char* p1 = s;
char* p2 = s+2;
memcpy(p2, p1, 5)与memmove(p2, p1, 5)的结果就可能是不同的,memmove()可以将p1的头5个字符"12345"正确拷贝至p2,而memcpy()的结果就不一定正确了

memcpy()、 memmove()和memccpy()
-------------------------------------------------------
    这三个函数的功能均是将某个内存块复制到另一个内存块。前两个函数的区别在于它们处理内存区域重叠(overlapping)的方式不同。第三个函数的功能也是复制内存,但是如果遇到某个特定值时立即停止复制。
    对于库函数来说,由于没有办法知道传递给他的内存区域的情况,所以应该使用memmove()函数。通过这个函数,可以保证不会出现任何内存块重叠问题。而对于应用程序来说,因为代码“知道”两个内存块不会重叠,所以可以安全地使用memcpy()函数。
原型:extern void *memccpy(void *dest, void *src, unsigned char ch, unsigned int count);
  用法:#include <string.h>
  功能:由src所指内存区域复制不多于count个字节到dest所指内存区域,如果遇到字符ch则停止复制。
  说明:返回指向字符ch后的第一个字符的指针,如果src前n个字节中不存在ch则返回NULL。ch被复制。
char s[]="Goldenx Global View";
char d[20];
char *p;
p=(char *)memccpy(d,s,'x',strlen(s));
if(p)
{
   *p='\0'; // MUST Do This
   printf("Char found: %s.\n",d);
}
else
   printf("Char not found.\n");

关于memmove的实现:
void *mymemmove(void *dest, const void *src, size_t n)
{
    char temp[n];
    int i;
    char *d = dest;
    const char *s = src;

    for (i = 0; i < n; i++)
        temp[i] = s[i];
    for (i = 0; i < n; i++)
        d[i] = temp[i];

    return dest;
}

memcpy()的简单实现:

    void *mymemcpy(void *dest, const void *src, size_t n)
    {
        char *d = dest;
        const char *s = src;
        int *di;
        const int *si;
        int r = n % 4;
        
        while (r--)
            *d++ = *s++;
        di = (int *)d;
        si = (const int*)s;
        n /= 4;
        while (n--)
            *di++ = *si++;

        return dest;
    }


memmove 和 memcpy的区别以及处理内存重叠问题

memmove 和 memcpy的区别以及处理内存重叠问题
  • Li_Ning_
  • Li_Ning_
  • 2016年05月15日 19:30
  • 11406

memcpy 与 memmove 区别

memcpy() -- 拷贝内存内容 表头文件: #include 定义函数: void *memcpy(void *dest, const void *src, size_tn) 函数说明:...
  • lwbeyond
  • lwbeyond
  • 2011年09月28日 15:34
  • 2609

memmove和memcpy函数的区别及实现

一、memmove()和memcpy()函数的strcpy()函数的区别;(1)使用的类型不同,strcpy()函数只对字符串进行操作;memmove()和memcpy()函数对所有类型都适用,为内存...
  • gogogo_sky
  • gogogo_sky
  • 2017年05月21日 01:37
  • 415

memcpy 与 memmove

memcpy:C和C++当中使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。   函数原型 void* me...
  • djb100316878
  • djb100316878
  • 2014年12月07日 20:24
  • 997

一些常用的字符串处理函数总结memcpy、memmove、memset、memcmp、memchr等

(1)原型void *memcpy(void *dest, const void *src, size_t n);  字符串复制函数,从内存区域src拷贝n个字节到dest,必须确保src和dest是...
  • u012088914
  • u012088914
  • 2016年03月06日 23:48
  • 890

memmove、memccpy和memcpy

这三个
  • q5707802
  • q5707802
  • 2014年05月27日 22:57
  • 1987

C语言:模拟实现memmove函数,memove与memcpy之间的相同与区别

讨论memcpy与memmove函数,并模拟实现memcpy,memmove函数
  • sinat_36101354
  • sinat_36101354
  • 2017年03月29日 23:30
  • 245

模拟实现memcpy和memmove函数

模拟实现memcpy和memmove函数,并做出部分的分析
  • qq_35116371
  • qq_35116371
  • 2016年08月15日 10:39
  • 952

memcpy和memmove函数的实现

  memcpy代码:;***;memcpy.asm - contains memcpy and memmove routines;;       Copyright (c) 1986-1997, M...
  • jianxiong8814
  • jianxiong8814
  • 2007年05月02日 21:46
  • 1144

内存操作函数memmove,memcpy,memset

通过字符串的学习,我们知道字符串操作函数的操作对象是字符串,并且它的结束标志是结束符\0,当然这个说的是不 受限制的字符串函数。然而当我们想要将一段内存的数据复制到另一块内存时,我们不能使用字符串操作...
  • peiyao456
  • peiyao456
  • 2016年04月30日 21:21
  • 844
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:memcpy()和memmove() 函数的介绍
举报原因:
原因补充:

(最多只允许输入30个字)