strcpy 和 memcpy

strcpy

char* strcpy(char* dest, const char* src);
strcpy提供了字符串的复制。即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符。

char* my_strcpy(char* dest,char* src)
{
    if (src == NULL || dest == NULL)
        return NULL;
    while(*dest++ = *src++)
    {}
    return dest;
}

memcpy

void *memcpy( void *dest, const void *src, size_tcount);
memcpy用来拷贝src所指的内存内容前n个字节到dest所指的内存地址上。与strcpy()不同的是,memcpy()会完整的复制n个字节,不会因为遇到’\0’而结束。

void* my_memcpy(void* dst,const void* src,int size)
{
    if (dst == NULL || src == NULL)
        return NULL;
    // 这里之所以创建两个临时变量指针 是为了强制转换成char*
    char* d = (char*)dst;
    char* s = (char*)src;
    while (size--)
    {
        *d++ = *s++;
    }
    return dst;
} 

例如: char a[10],b[5];
memcpy(b, a, sizeof(b)); //注意如果用sizeof(a),会造成b的内存地址溢出,并且第三个参数是字节数

strcpy和memcpy的区别

1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。

2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符”\0”才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。
3、用途不同。通常在复制字符串时用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只是memmove的一个子集。memmove在copy两个有重叠区域的内存时可以保证copy的正确,而memcopy就不行了,但memcopy比memmove的速度要快一些

关于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;
}

猜你喜欢

转载自blog.csdn.net/qq_25424545/article/details/78282836
今日推荐