自己实现基本的C标准库函数——实现memcpy

来源:互联网 发布:淘宝店铺第四层级 编辑:程序博客网 时间:2024/06/03 22:48

不调用库函数,实现memcpy。

 

转自:http://hi.baidu.com/sernger/blog/item/fa900ecb43d44f4ff21fe7ea.html

首先对这个函数做一些说明。

#include <string.h>

void *memcpy(void *to, const void *from, size_t count)

函数memcpy()从from指向的数组向to指向的数组复制count个字符。如果两数组重叠,不定义函数的行为。

在C99中,to和from由restrict修饰。

先来看看微软的实现:

void * __cdecl memcpy (
        void * dst,
        const void * src,
        size_t count
        )
{
        void * ret = dst;

#if defined (_M_IA64)
        {
        extern void RtlMoveMemory( void *, const void *, size_t count );

        RtlMoveMemory( dst, src, count );
        }
#else /* defined (_M_IA64) */
        /*
         * copy from lower addresses to higher addresses
         */
        while (count--) {
                *(char *)dst = *(char *)src;
                dst = (char *)dst + 1;
                src = (char *)src + 1;
        }
#endif /* defined (_M_IA64) */

        return(ret);
}

再来看看coreutils中的实现:

void *
memcpy (void *destaddr, void const *srcaddr, size_t len)
{
char *dest = destaddr;
char const *src = srcaddr;

while (len-- > 0)
    *dest++ = *src++;
return destaddr;
}


再来看Linux中实现:

void *memcpy(void *dest, const void *src, size_t count)
{
char *tmp = dest;
const char *s = src;

while (count--)
*tmp++ = *s++;
return dest;
}

 

如果考虑地址重叠的问题,面试一般希望考虑这个问题,答案如下:

转自:http://topic.csdn.net/u/20080324/12/7059a90f-905a-4984-abb3-a9e43e440d16.html

原创粉丝点击