经典C语言面试题14:memcpy使用注意事项

memcpy函数原型如下:

void *memcpy(void *dst, const void *src, size_t n)

功能:用来拷贝src所指的内存内容前n个字节到dst所指的内存地址上。

使用时应当注意以下几点:

1、如果复制的字节数n超出了dst的空间容量,或者n超出src的容量,此函数是不会进行判断的,这样就很危险。因此,需要程序员自己检查是否有溢出的情况出现。

2、此函数不会检查参数dst与参数src所指向的数组(或其他类型)是否具有同样的空间大小。

3、如果出现src地址大于dst地址(即地址重叠),就会出现dst无法存取完整数据,造成src数据丢失。

总之,memcpy本身是有bug的,并没有解决覆盖问题,可以用memmove代替,也可以自己实现。

void *my_memcpy(void *dst, const void *src, size_t n)
{
    char *psrc = NULL;
    char *pdst = NULL;

    if((NULL == dst) || (NULL == src))
    {
        return NULL;
    }
    
    /*出现重叠,反向拷贝(由高到低)*/
    if((src < dst) && (((char*)src + n) > (char*)dst))    
    {
        psrc = (char*)src + n - 1;
        pdst = (char*)dst + n - 1;
        while(n--)
        {
            *pdst-- = *psrc--;
        }
    }
    else
    {
        psrc = (char*)src;
        pdst = (char*)dst;
        while(n--)
        {
            *pdst++ = *psrc++;
        }
    }
    return dst;
}

------------------------------------------------The end---------------------------------------------------

你可能感兴趣的:(C语言基础&面试常见问题)