b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

事实:memmove和memcpy之间的区别以及如何处理内存重叠问题

电脑杂谈  发布时间:2020-09-05 04:11:57  来源:网络整理

memcpy和strcpy的区别_memcpy内存重叠_memcpy memmove 区别

区别:

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函数

memcpy和strcpy的区别_memcpy memmove 区别_memcpy内存重叠

Memcpy原型:

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

说明:

memcpy()函数将src存储器中的n个字节复制到dest存储器区域,但是源和目标存储器区域不能重叠。

返回值:

memcpy memmove 区别_memcpy和strcpy的区别_memcpy内存重叠

memcpy()函数返回一个指向dest的指针。

二、记忆功能

Memmovey原型:

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

说明:

memcpy memmove 区别_memcpy内存重叠_memcpy和strcpy的区别

memmove()函数将src内存中的n个字节复制到dest内存区域,但是源内存和目标内存可以重叠。

返回值:

memmove函数返回一个指向dest的指针。

从上面的描述可以看出,两者之间的唯一区别是,在处理重叠区域时,memmove可以正确完成相应的副本,但是memcpy无法。

内存覆盖有两种情况,

memcpy内存重叠_memcpy和strcpy的区别_memcpy memmove 区别

首先看一下memcpy()和memmove()这两个函数的实现:

void* my_memcpy(void* dst, const void* src, size_t n)
{
    char *tmp = (char*)dst;
    char *s_src = (char*)src;
    while(n--) {
        *tmp++ = *s_src++;
    }
    return dst;
}

从实现中可以看出,memcpy()从内存的左侧开始逐字节将src的内容复制到dest的内存中。此实现导致图中的第二个内存重叠。在这种情况下,后两个字节的复制值显然不是原始值,而新值已成为src的前两个字节。

对于第一种内存覆盖情况,可以使用此memcpy复制方法。

Memmove在第二种内存覆盖情况下改进了memcpy。改进后的代码如下:

void* my_memmove(void* dst, const void* src, size_t n)
{
    char* s_dst;
    char* s_src;
    s_dst = (char*)dst;
    s_src = (char*)src;
    if(s_dst>s_src && (s_src+n>s_dst)) {      //-------------------------第二种内存覆盖的情形。
        s_dst = s_dst+n-1;
        s_src = s_src+n-1;
        while(n--) {
            *s_dst-- = *s_src--;
        }
    }else {
        while(n--) {
            *s_dst++ = *s_src++;
        }
    }
    return dst;
}

在第二次内存覆盖的情况下,memcpy将出错,但memmove将正常工作。

启发我!


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shoujiruanjian/article-314157-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...