分享

C语言memcpy和memmove

 心不留意外尘 2016-05-19


http://9195095.blog.51cto.com/9185095/1765185

2015

一、memcpy

  memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void* my_memcpy(void* dest, const void *src, size_t n)
{
    assert(dest);
    assert(src);
    char* dest_t = (char*)dest;
    char* src_t =(char*) src;   
    while (n--)
    {
        *dest_t = *src_t;
        dest_t++;
        src_t++;
    }
    return dest;
}

二、memmove

   memmove用于从src拷贝n个字符到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。但复制后src内容会被更改。但是当目标区域与源区域没有重叠则和memcpy函数功能相同。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
void* my_memmove(void* dest, const void*src, size_t n)
{
    assert(dest);
    assert(src);
    void *ret = dest;
    char* dest_t = (char*)dest;
    char* src_t = (char*)src;
    if (dest_t <= src_t || dest_t >= (src_t + n))
    {
        // 若dst和src区域没有重叠,则从起始处开始逐一拷贝;
        while (n--)
        {
            *dest_t++ = *src_t++;
        }
    }
    else 
    {
        // 若dst和src 区域交叉,则从尾部开始向起始位置拷贝,可以避免数据冲突
        dest_t += n - 1;
        src_t += n - 1;
        while (n--)
        {
            *dest_t-- = *src_t--;
        }
    }
    return ret;
}


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多