首页 > c/c++, linux, 面试 > memmove函数真的没有问题了?

memmove函数真的没有问题了?

2015年11月18日 642 人阅读 发表评论 阅读评论

1、思考

首先思考一个问题:“不是已经有了memcpy了码?为什么还要提供memmove?”

2、解惑

通过man手册我们可以发现memcpy和memmove的原型都是void * (void *dest, const void *src, size_t n);那么它们有什么区别,通过查看memcpy和memmove的源码我们发现memcpy是从低地址往高地址逐字节的拷贝,而memmove则会比较一下dest和src地址的大小,当src地址大于dest时memmove的行为和memcpy的行为是一致的,当dest地址大于src时,memmove则是从高地址往低地址逐字节的拷贝,从而避免了当dest地址大于src地址且拷贝区域存在交叉的情况下,dest最后几个字节的值有误的情况。

3、反思

memmove这么处理后就没问题了?其实这里有一个隐藏的坑,memmove只保证了dest缓冲区拷贝的字节的正确性,但它没保证src缓冲区字节的正确性,因为当dest和src缓冲区域存在交叉的情况下,src缓冲区的头或者尾处的数据被覆盖导致src缓冲区变成脏数据,如果后续再使用src缓冲区就会出现错误,因为src缓冲区中的数据已经是脏数据了。

分类: c/c++, linux, 面试 标签: ,
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.