strcpy 和 memcpy

本文介绍了C语言中的strcpy和memcpy函数,包括它们的使用方法、区别以及应用场景。strcpy专门用于字符串复制,遇到''结束,而memcpy可以复制任意内容,需要指定复制长度。此外,还讨论了深拷贝和浅拷贝的概念,以及memcpy与memmove在处理内存重叠时的不同之处。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值