博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
memcpy源代码
阅读量:5796 次
发布时间:2019-06-18

本文共 1228 字,大约阅读时间需要 4 分钟。

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

}

 

转载地址:http://esifx.baihongyu.com/

你可能感兴趣的文章
android国外网站
查看>>
Ant路径匹配规则AntPathMatcher的注意事项
查看>>
《软件测试自动化之道》读书笔记 之 底层的Web UI 测试
查看>>
目录结构
查看>>
内存泄漏工具VLD1.0_要点分析
查看>>
轮询调度算法
查看>>
Oracle截取固定位数的小数方法总结
查看>>
iOS学习笔记: 获取数组中某一段元素
查看>>
oracle的本地远程连接和配置
查看>>
BZOJ 2049 [Sdoi2008]Cave 洞穴勘测 ——Link-Cut Tree
查看>>
BZOJ 3196 二逼平衡树 ——树套树
查看>>
NSURLSession学习笔记(二)Session Task
查看>>
10秒视频转局部GIF动画
查看>>
leetcode 62. 不同路径
查看>>
Linux下的FTP服务器配置
查看>>
14. 二分查找
查看>>
# 过去 现在 未来
查看>>
软件工程结对编程第二次作业
查看>>
PLSQL Developer连接远程oracle配置
查看>>
性能产生的十大原因
查看>>