分享

memcpy&memmove的比较

 ankle 2006-11-01
题目:编写一个函数将内存某一位置开始,地址长度为n的数据复制到内存的另一个位置中。
(笔试时我不太清楚如何实现向内存中读,写数据。请高手指教!)
///////////////////////////////////////////////////////////////////////

这类题在国内好一些的软件公司的笔试中经常出现。
C标准库的<string.h>中提供了memcpy,memmove等函数实现。
void *memcpy(void *dest, const void *src, size_t len);
void *memmove(void *dest, const void *src, size_t len);
说明:
memcpy与memmove都是从src向dest复制len个字符并返回dest。
差别在于memmove能对src与dest重叠内存区正确工作,即memmove好象先把src内存区先复制到另一临时内存区

,然后再复制到dest内存区(但库的实际实现中没有用临时内存区);
而memcpy的行为在src与dest的重叠内存区上是未定义的,但memcpy往往比memmove更快一些。

下面我们来自己实现它们:
;
; /* memcpy Algorithm: */
;
; void * memcpy(void * dst, void * src, size_t count)
; {
; void * ret = dst;
;
;
; while (count--)
; *dst++ = *src++;
;
/* 返回dst的指针 */
; return(ret);
; }


; /* memmove Algorithm: */
;
; void * memmove(void * dst, void * src, size_t count)
; {
; void * ret = dst;
;
; if (dst <= src || dst >= (src + count))
{
; /* 当没有重叠内存区域时 */
; while (count--)
; *dst++ = *src++;
; }
; else
{
; /* 当出现重叠内存区域时 */
; dst += count - 1;
; src += count - 1;
;
; while (count--)
; *dst-- = *src--;
; }
;
; return(ret);
; }
以上我只写了一个简单的实现,想更深入理解,请参阅:
《The Standard C Library》/*库作者讲述库的实现*/
《C语言接口与实现》

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多