引言
面试中经常会遇到这样一些题目,比如memmove、memcpy和strcpy等函数,用来考察编程基本功。memcpy不会进行内存重叠检查,而memmove会进行检查,面试的时候这个问题一般是考察这一点的,即要求检查内存是否有重叠区域。还要注意的是不能直接对void*进行操作,需要转换类型。并且函数原型src的地址需要是const*类型,即不能修改,细节。
代码
void *memmove(void *dest, const void *source, size_t count) { assert((NULL != dest) && (NULL != source)); char *tmp_source, *tmp_dest; tmp_source = (char *)source;//注意,void*类型不能直接操作,需要进行转换。 tmp_dest = (char *)dest; if((dest + count<source) || (source + count) <dest)) {// 如果没有重叠区域 while(count--) *tmp_dest++ = *tmp_source++; } else { //如果有重叠(反向拷贝) tmp_source += count - 1; tmp_dest += count - 1; while(count--) *--tmp_dest = *--tmp; } return dest; }