【面试题,纸上写程序】实现memcpy函数
来源:互联网 发布:战地1武器数据 编辑:程序博客网 时间:2024/04/30 01:10
[以下内容转自:http://my.oschina.net/renhc/blog/36345,作者:任洪彩,2011-12-02],这篇解释的相对比较透彻些!
面试中如问到memcpy的实现,那就要小心了,这里有陷阱。
先看下标准memcpy()的解释:注意下面的注释,对于地址重叠的情况,该函数的行为是未定义的。
事实上所说的陷阱也在于此,自己动手实现memcpy()时就需要考虑地址重叠的情况。
另外,标准库也提供了地址重叠时的内存拷贝函数:memmove(),那么为什么还要考虑重写memcpy()函数呢?因为memmove()函数的实现效率问题,该函数把源字符串拷贝到临时buf里,然后再从临时buf里写到目的地址,增加了一次不必要的开销。
下面给出memcpy()的实现,为了与标准库函数区分,我们实现其包裹函数:
void*Memcpy(void *dst, const void *src, size_t size); int main(intargc, char *argv[]){ char buf[100] = "abcdefghijk"; memcpy(buf+2, buf, 5); //Memcpy(buf+2, buf, 5); printf("%s\n", buf+2); return 0;} void*Memcpy(void *dst, const void *src, size_t size){ char *psrc; char *pdst; if(NULL == dst || NULL == src) { return NULL; } if((src < dst) && (char *)src +size > (char *)dst) // 自后向前拷贝 { psrc = (char *)src + size - 1; pdst = (char *)dst + size - 1; while(size--) { *pdst-- = *psrc--; } } else { psrc = (char *)src; pdst = (char *)dst; while(size--) { *pdst++ = *psrc++; } } return dst;}
使用Memcpy()的结果: abcdehijk
使用memcpy()的结果: abcdehijk,//在VC6.0中仍然输出abcdehijk,可能的原因就是:有的函数库实现的memcpy函数考虑到了地址重叠,所以不会有错,而另外一些函数库并没有考虑到。
可以看到标准库函数的源字符串在拷贝的过程中被污染了。
- 【面试题,纸上写程序】实现memcpy函数
- 【面试题】实现memcpy函数
- (C++面试题)请实现strcpy、memcpy函数
- 常见面试题-memcpy()实现
- [程序员面试题]memcpy的实现
- [经典面试题]实现memcpy库函数
- 【C语言】【面试题】【笔试题】模拟实现数据库中memcpy函数
- 百度面试题:写一个memcpy函数的源代码。
- 【面试题】strcmp函数实现
- 【面试题】printf函数实现
- 面试题 实现memmove函数
- 面试题:编写一个memcpy函数、一个strcpy函数和一个strlen函数
- memcpy函数的实现
- memcpy函数实现
- memcpy函数内部实现
- 【转】实现memcpy函数
- memcpy函数实现
- memcpy函数的实现
- poj 1019 Number Sequence
- RLE流压缩——简单算法
- 压缩一览
- malloc(0)的问题
- 单向加密算法
- 【面试题,纸上写程序】实现memcpy函数
- 设计模式6大原则
- android平台canvas贴文字、斜体
- Bash array iteration
- qt 控件自动适应窗口
- 在Qt 中如何使用OpenCV库
- 线段树 HDU 2227 Find the nondecreasing subsequences
- 记尝试书写一个集中管理调试输出的头文件
- HDU 3368 Reversi