//memmove()函数解决内存覆盖问题
#include<iostream> #include<assert.h> using namespace std; void *memmove(void *dest, const void *source, size_t count) { assert((NULL != dest) && (NULL != source)); char *tmp_source, *tmp_dest; tmp_source = (char *)source; tmp_dest = (char *)dest; if((tmp_dest + count<tmp_source) || (tmp_source + count) <tmp_dest) {// 如果没有重叠区域 while(count--) *tmp_dest++ = *tmp_source++; } else { //如果有重叠(反向拷贝) tmp_source += count - 1; tmp_dest += count - 1; while(count--) *--tmp_dest = *--tmp_source; } return dest; }
//memcpy()函数对内存覆盖的解决方案
#include<iostream> #include<assert.h> using namespace std; void * memcpy(void * dest, void * source,size_t count) { if(dest==NULL||source==NULL) { return NULL; } else { char * tmp_source,* tmp_dest; tmp_source=(char *)source; tmp_dest=(char *)dest;//如果指针是字符串,我们必须考虑字符串的长度 if(tmp_dest + count >= tmp_source || tmp_source + count >= tmp_dest) { if(tmp_dest + count >= tmp_source)//dest在source前面并且出现内存重叠,从前向后拷贝 { while(count--) { *tmp_dest++=*tmp_source++; } } else//dest在source后面并出现内存重叠,从后往前拷贝 { tmp_dest+=count-1; tmp_source+=count-1; while(count--) { *tmp_dest--=*tmp_source--; } } } else//无内存重叠现象 { while(count--) { *tmp_dest++=*tmp_source++;// *tmp_dest--=*tmp_source也可以 } } } return dest; }