Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2697531
  • 博文数量: 877
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 5921
  • 用 户 组: 普通用户
  • 注册时间: 2013-12-05 12:25
个人简介

技术的乐趣在于分享,欢迎多多交流,多多沟通。

文章分类

全部博文(877)

文章存档

2021年(2)

2016年(20)

2015年(471)

2014年(358)

2013年(26)

分类: LINUX

2014-07-23 16:03:16


http://blog.csdn.net/zhongshch/article/details/6529212

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

阅读(478) | 评论(0) | 转发(0) |
0

上一篇:GNU ARM 汇编指令

下一篇:memcpy源码

给主人留下些什么吧!~~