【题目】
用C语言实现函数void *memmove(void *dest, const void *src, size_t n)。memmove函数的功能死拷贝src所指向内存内容前n个字节到dest所指的地址上。
【例子】
源字符串是hello word!,要求目标字符串也是helloword!。
【分析】
作为公用库函数,请注意安全检查,注意处理内存区重合的情况。代码本身比较简单。
【代码】
#include <iostream> #include <cstdio> #include <cstring> void * my_memmove( void * const dest, const char * const src, size_t n ) { // check parameters if( 0 == n ) { return NULL; } if( NULL == dest || NULL == src ) { return NULL; } char * psrc = (char *)src; char * pdest = (char *)dest; if( pdest <= psrc || pdest > psrc + n ) { std::cout << "forward overlapping" << std::endl; // copy forward direction for( size_t i = 0; i < n; i++ ) { *pdest = *psrc; pdest++; psrc++; } } else { std::cout << "backward overlapping" << std::endl; // copy backward direction pdest = pdest + n; psrc = psrc + n; for( size_t i = 0; i< n; i++ ) { *pdest = *psrc; pdest--; psrc--; } } return dest; } int main( int argc, char ** argv ) { char *src = new char[100]; sprintf( src, "%s", "hello world!" ); char * dest = new char[100]; memset( dest, 0, 100*sizeof(char ) ); std::cout << src << std::endl; char * result = (char*)my_memmove( dest, src, strlen(src) ); std::cout << result << std::endl; delete src; delete dest; return 0; }