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

  • 相关阅读:
    线程等待和通知
    什么是代码?code?
    代理(正向代理)和反向代理的区别是什么?
    什么是代理,什么是代理服务器,使用代理服务器的目的是什么?
    计算领域,编码的含义到底是什么?
    linux中,通过crontab -e编辑生成的定时任务,写在哪个文件中
    linux,shell中if else if的写法,if elif
    linux,shell脚本中获取脚本的名字,使用脚本的名字。
    linux,crontab定时任务中为脚本指定使用参数,crontab的脚本中是否可以带参数
    ssh在本地调用远程主机上的命令,不登录远程主机shell
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4557748.html
Copyright © 2020-2023  润新知