一个关键的函数——strcpy的实现

1. strcpy函数的原型是:

/*简单的形式,但是这种形式没有考虑内存重叠的情形*/
char* strcpy(char* dst, const char* src) {
    assert(dst != NULL&&src != NULL);
    char* ret = dst;
    while ((*dst++ = *src++) != '\0');
    return ret;
}

几个注意点:[1]const修饰;[2]空指针检查;[3]返回目标地址

2.假如要考虑dst和src内存重叠的情况,strcpy应该如何实现?

所谓的内存重叠,发生在src未处理的部分被dst覆盖的情况下——src<=dst<=src+strlen(src)

C函数的memcpy()自带内存重叠检测功能。

于是strcpy的实现实际如下,利用了memcpy函数来进行运算。

/*strcpy函数中,使用memcpy来防止内存重叠问题*/
char* strcpy(char* dst, const char* src) {
    assert(dst != NULL&&src != NULL);
    char* ret = dst;
    /*要格外注意,这里memcpy的参数中有+1,这是看了好久的困惑了!因为涉及到memcpy函数的局限性*/
    memcpy(dst, src, strlen(src) + 1);
    return ret;
}

关于memcpy函数:

注意:memcpy函数实现内存拷贝,可以拷贝任何数据类型。源数据类型不能被改变。

函数原型为:void* memcpy(void* dst, const void* src, int cnt)

memcpy函数需要注意的点为:

1.空指针的问题,如果dest、src两者或者两者之一为NULL;

2.拷贝大小count为小于等于0的值;

3.内存重叠。

void * memcpy(void *dst, const void *src, size_t cnt)
{
    assert(dst != NULL&&src != NULL&&cnt > 0);
    if (dst == src)
        return dst;
    void *ret = dst;
    if (dst > src&&(char*)dst < ((char*)src + cnt)) {
        dst = (char*)dst + cnt - 1;
        src = (char*)src + cnt - 1;
        while (cnt--) {
            *(char *)dst = *(char *)src;
            dst = (char *)dst - 1;
            src = (char *)src - 1;
        }
    }
    else {
        while (cnt--) {
            *(char *)dst = *(char *)src;
            dst = (char *)dst + 1;
            src = (char *)src + 1;
        }
    }
    return dst;
}

 

posted on 2017-07-08 16:50  sjqiu  阅读(221)  评论(0编辑  收藏  举报

导航