zoukankan      html  css  js  c++  java
  • memcpy源代码

    7月22号去面试开发的职位,面试官先问我在以前项目中写了什么程序。我就巴拉巴拉的说了一堆写过的code,主要还是测试工具和自动化测试代码。之后让我写memcpy的函数,面试官还挺好的,帮我把函数原型都写出来,以下是我的code.
     
    void memcpy(void *dest, void *src, int len)
    {
          void *p = dest;
          void *q = src;
          if( dest == NULL ||src == NULL)
          {
              return;
          }
     
          for (int i=0; i<len; i++)
         {
                *p++ = *q++;
         }
    }
     
    面试完了后我自我感觉良好。可是后来hr告诉没通过。我还觉得难以接受,没想到第二天公司的一个同事就正好讲到类似的函数。我才知道我错的有多么的严重。
    1、函数原型应该是 void*memcpy(void* dest,const void* src,size_t count)。虽然面试官给我写的原型也是错的,但是我应该早点看看的。


    2、按照ANSI(American National Standards Institute)标准。不能对void指针进行算法操作。即不能对void指针进行如p++的操作,所以需要转换为具体的类型指针来操作,例如char *。
    3、memcpy是对内存进行操作。可能遇到内存重叠的情况。同样的问题存在于memmove中, 但是源代码中这两个函数的处理方式不一样:

         memcpy中dest和source中的区域不能重叠,否则会出现未知结果中dest和source中的区域不能重叠,否则会出现未知结果。

    函数没做

         任何内存的处理,内存是否重叠由程序员自己控制。

         memmove里面则判断了内存重叠的情况,当内存重叠时从后往前复制,以确保复制正常处理。 
    源代码如下
    void * __cdecl memcpy (
            void * dst,
            const void * src,
            size_t count
            )
    {
            void * ret = dst;

    #if defined (_M_IA64)

            {


            __declspec(dllimport)


            void RtlCopyMemory( void *, const void *, size_t count );

            RtlCopyMemory( 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);
    }

  • 相关阅读:
    《JavaScript 闯关记》之初探
    《JavaScript 闯关记》之简介
    《JavaScript 闯关记》
    JavaScript检测之basevalidate.js
    如何排版 微信公众号「代码块」
    android开发之路03
    android开发之路02(浅谈BroadcastReceiver)
    android开发之路01
    软件工程复习(一)
    软件工程—人件(一)
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4557748.html
Copyright © 2011-2022 走看看