strcpy源码分析

1、微软源码

char * strcpy(char * dst, const char * src)
{
    char * cp = dst;
    while(*cp++ = *src++);
    return (dst);
}

Q:为什么多一步 char * cp = dst;的操作,并且返回dst?

A:因为虽然cp和dst内存是一样,但是经过赋值后cp所指向的并不是字符串的首部,而dst还指向字符串的首部。

 

2.内存重叠问题

如果源地址与目标地址冲突,有二种情况:

①如果src地址>dst地址,src从低地址到高地址赋值给dst。

②如果dst地址>src地址,src从高地址到低地址赋值给dst。

 

源码:

char* my_memcpy(char* _Dest, const char* _Source, int count) {
    assert(NULL != _Dest);
    assert(NULL != _Source);
    if (NULL == _Dest || NULL == _Source)
        return NULL;
    char* ret = _Dest;

    if (_Dest > _Source && _Dest < _Source + count) {
        _Dest = _Dest + count - 1;
    }
    else {
        while (count--) {
            *_Dest++ = *_Source++;
        }
    }
    return ret;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值