Linux 库函数源码分析(1) --- memmove

来源:互联网 发布:ubuntu 16.04 主题包 编辑:程序博客网 时间:2024/06/05 17:24

void *memmove(void *dest, const void *src, size_t count){char *tmp;const char *s;if (dest <= src) {tmp = dest;s = src;while (count--)*tmp++ = *s++;} else {tmp = dest;tmp += count;s = src;s += count;while (count--)*--tmp = *--s;}return dest;}


这个是从linux内核里面提取的源码,我们可以看到memmove 考虑到内存重叠的情况,需要判断内存地址位置,

如果dest在src的前面,那就可以从头部开始move,反之则需要从尾部开始move

另外需要注意的是参数类型是void*,这个是不能进行运算操作的,必须转为char* (网上看到有些文章没有转换应该是错误的)

当然有些同学可能觉得代码还可以更精简,其实本质应该还是一样的,以下代码仅供参考

void *memmove(void *dest, const void *src, size_t count){void *ret = dest;if (dest <= src) {while (count--)*(char*)dest++ = *(char*)src++;} else {dest = (char*)dest + count;src = (char*)src + count;while (count--)*--dest= *--src;}return ret;}




0 0
原创粉丝点击