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

  • 相关阅读:
    福州KTV
    MSN登陆不上:微软谴责中国的“技术问题”
    DB2 存储过程开发最佳实践
    在DB2存储过程中返回一个数据集
    Host is not allowed to connect to this MySQL server 解决方案
    CentOS安装中文支持
    ImportError: libpq.so.5: cannot open shared object file: No such file or directory
    CentOS 终端显示中文异常解决办法
    pytestDemo
    python 获取当前运行的类名函数名
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4557748.html
Copyright © 2011-2022 走看看