今天到I 公司去面试,面试方式比较特殊,没有笔试,就是2 个面试官,一人一句轮番发问,涉及面很广,涉及到操作系统(MMU 、page out 、process/thread 、semaphore 、interrupt), OOP( 多态、design pattern) 、数据结构( 排序、二叉查找树) 、计算机网络(OSI 5 层) 、C 语言(big/small endian) 、英语口语等等,问了大约一个小时左右。

所有问题都是口头表述,只在纸上写了一个memcpy 程序,用C 语言实现,脑子一发蒙,既然写成了strcpy ,真该死。

回家了查询了一下memcpy 定义,如下:

Void *memcpy(void *dest, const void *src, unsigned int count);

查询msdn, 发现Remark 如下:

memcpy copies count bytes from src to dest ; If the source and destination overlap, the behavior of memcpy is undefined. Use memmove to handle overlapping regions.

以上描述针对dest 和 src 所指的内存地址有重叠的情况,内存地址重叠情况,memcpy 函数处理步骤未定,而memmove 对重叠情况给予处理;

在winXP+visual c++2005 测试 memcpy 函数,程序如下:

#include "stdafx.h"

#include <string.h>

int _tmain (int argc , _TCHAR * argv [])

{

char s [16] = "aabbcc" ;

char d [16] = {0};

memcpy (s +2, s , 4);

printf ("%s" , s );

return 0;

}

结果输出 “aaaabb”, 由此可见windows 平台的c 运行时MSVCRT 的memcpy 函数对重叠部分做了处理,同memmove 的实现。//notes: 如果重叠部分不做处理,应该输出”aaaaaa”

下面我们用c 语言来实现memcpy 函数, 首先我们写出不对内存重叠的处理函数,如下:

void *memcpy_no_handle_overlap (void *dest , void *src , unsigned int count )

{

if ((NULL ==dest ) || (NULL ==src ))

return NULL ;

char *d = (char *)dest ;

char *s = (char *)src ;

//Do normal (Upwards) Copy

while (count -- > 0)

*d ++ = *s ++;

return dest ;

}

测试程序如下:

int _tmain(int argc, _TCHAR* argv[])

{

char s[16] = "aabbcc";

char d[16] = {0};

memcpy_no_handle_overlap(s+2, s, 4);

printf("%s", s);

return 0;

}

输出结果”aaaaaa”

下面讨论处理memory overlapping 情况,如下图:

判断overlapping 条件如下:

If ( (dest <= src) ||                // green region 1

(dest >=src+count) )           // green region 2

{

// no memory overlapping

}

Else  // red region 3

{

// there is overlapping

}

Overlapping 的处理:

我们可以看到memcpy_no_handle_overlap 函数,是从低地址依次赋值到高地址;在处理overlapping 时,如果我们采用同样的方法( 低地址到高地址) ,高地址的值将会被覆盖,所以我们应该从高地址依次到低地址赋值,如下图:

函数代码如下:

void *memcpy_handle_overlap(void *dest, void *src, unsigned int count)

{

if ((NULL==dest) || (NULL==src))

return NULL;

char *d = (char *)dest;

char *s = (char *)src;

//Check for overlapping buffers:

if ( (d<=s) || (d>=s+count) )

{

//Do normal (Upwards) Copy

while (count-- > 0)

*d++ = *s++;

}

else

{

//Do Downwards Copy to avoid propagation

while (count > 0)

{

*(d+count-1) = *(s+count-1);

--count;

}

}

return dest;

}

测试代码:

int _tmain(int argc, _TCHAR* argv[])

{

char s[16] = "aabbcc";

char d[16] = {0};

memcpy_handle_overlap(s+2, s, 4);

printf("%s", s);

return 0;

}

输出结果为: “aaaabb “

最后测试代码如下:

int _tmain(int argc, _TCHAR* argv[])

{

char s[16] = "aabbcc";

memcpy_no_handle_overlap(s+2, s, 4);

printf("memcpy(ignore memory overlapping): %s/n", s);

strcpy(s, "aabbcc");

memcpy_handle_overlap(s+2, s, 4);

printf("memcpy(handle memory overlapping): %s/n", s);

strcpy(s, "aabbcc");

memcpy(s+2, s, 4);

printf("memcpy( MSVCRT ): %s/n", s);

strcpy(s, "aabbcc");

memmove(s+2, s, 4);

printf("memmove( MSVCRT): %s/n", s);

return 0;

}

输出结果为:

memcpy(ignore memory overlapping): aaaaaa

memcpy(handle memory overlapping): aaaabb

memcpy( MSVCRT ): aaaabb

memmove( MSVCRT): aaaabb

c语言实现memcpy相关推荐

  1. C语言:memcpy、memmove等函数的了解,使用以及模拟实现

    C语言:memcpy.memmove等函数的了解,使用以及实现 1.memcpy函数的介绍,使用,以及实现 2.memmove函数的介绍,使用,以及实现 1.memcpy函数的介绍,使用,以及实现 1 ...

  2. C语言之memcpy()函数

    昨天被问了个很基础的C语言的问题. 写出u8 * memcpy(u8 * src, u8 * dst, size_t len)的定义. 比较紧张,以为要考虑很多东西:于是,将很多乱七八糟的情况考虑了下 ...

  3. C语言:memcpy的用法

    memcpy是memory copy的缩写,意为内存复制,在写C语言程序的时候,我们常常会用到它.它的函原型如下: void *memcpy(void *dest, const void *src, ...

  4. C语言之memcpy函数

    昨天自己动手实现memcpy这个函数,用一个例程试了一下,结果正确,满心欢心,可是有些地方想不明白,于是百度了一下,结果自己写的函数简直无法直视. 觉得还是写个总结,以示教训. 先贴上我自己的函数: ...

  5. C语言:memcpy()---数据拷贝

    C语言 基础开发----目录 1.memcpy() 简介 1.1 函数原型 void *memcpy(void *destin, void *source, unsigned n); 1.2 参数 d ...

  6. c语言 char memcpy,在C中使用memcpy复制无符号字符数组

    int n=50; 假设你在32位机器上,'n'将是一个4字节的值. N = 0x00000032 = 00000000B 00000000B 00000000B 00110010b unsigned ...

  7. C语言的memcpy和memmove

    浅谈memcpy和memmove POSIX和C标准明确表示,使用重叠区域的mem‐cpy()会产生未定义的行为. memcpy和memmove的区别是:当内存发生局部重叠时memmove函数能够保证 ...

  8. c语言memcpy函数源代码,memcpy函数-memcpy函数,C语言

    本教程分享:<memcpy函数>, memcpy是memorycopy的缩写,意为内存复制,在写C语言程序的时候,我们常常会用到它.它的函原型如下:. void * memcpy ; .如 ...

  9. c语言memcpy是什么,C语言memcpy函数的用法

    介绍 memcpy是memory copy的缩写,意为内存复制,在写C语言程序的时候,我们常常会用到它.它的函原型如下: void *memcpy(void *dest, const void *sr ...

最新文章

  1. 松江库卡机器人_上海高质量发展调研行|库卡机器人:为全球提供“松江创造”的产品...
  2. 设置虚拟工作空间_建筑狂想曲 | 建筑学习生活空间虚拟设计工作营最终评图
  3. ubuntu配置android开发环境和编译源码遇到的一些问题
  4. python的文件流,初步网页爬虫,序列化和反序列化
  5. performSelector may cause a leak because its selector is unknown
  6. hadoop namenode管理元数据机制
  7. iPhone 6起火燃烧?苹果称正调查原因
  8. POJ1276:Cash Machine(多重背包)
  9. smtp、esmtp、pop3命令使用
  10. 阿里云解决方案汇总,24种上云场景,20O+篇企业上云实践
  11. 2015年 教师全员远程培训挂机 教师远程全员培训挂机 教师继续教育挂机 挂机软件 全国通用版...
  12. 80x86段寻址的原因
  13. jsp实现文件下载,out = pageContext.pushBody();out.close();不用写到jsp中
  14. 希尔排序及手推时间复杂度(java实现)
  15. 【win10】win10下两个显示器不同桌面壁纸
  16. OpenCV学习(13) 细化算法(1)
  17. 创建TimesTen 数据库
  18. thinkpad分区win10_win10系统联想笔记本显示隐藏的分区的还原技巧
  19. 2015十大最具影响力的推广—兄弟连IT教育
  20. OpenGL蓝宝书第九章学习笔记:片段着色器和帧缓存

热门文章

  1. java.lang.Thread使用及总结
  2. YTU 2899: D-险恶逃生 I
  3. 程序员肿么了?为何总被认为是“屌丝”
  4. mysql 写入400_MySQL5.7运行CPU达百分之400处理方案
  5. sklearn库安装_没有依赖库也能跑机器学习模型!推荐一个强大工具m2cgen
  6. zuul两大作用_SpringCloud微服务(05):Zuul组件,实现路由网关控制
  7. python反转字符串_python翻转字符串
  8. mvc模型中MySQL类_Mvc5 EF6 CodeFirst Mysql (二) 修改数据模型
  9. xshell连接不了服务器显示22端口,win10安装redis,xshell无法连接22端口
  10. 计算机wrod初级考试题及答案,计算机基础知识+Word基础知识+Excel基础知识试题答案解析.doc...