题目:编写一个函数将内存某一位置开始,地址长度为n的数据复制到内存的另一个位置中。 (笔试时我不太清楚如何实现向内存中读,写数据。请高手指教!) /////////////////////////////////////////////////////////////////////// 这类题在国内好一些的软件公司的笔试中经常出现。 C标准库的<string.h>中提供了memcpy,memmove等函数实现。 void *memcpy(void *dest, const void *src, size_t len); void *memmove(void *dest, const void *src, size_t len); 说明: memcpy与memmove都是从src向dest复制len个字符并返回dest。 差别在于memmove能对src与dest重叠内存区正确工作,即memmove好象先把src内存区先复制到另一临时内存区 ,然后再复制到dest内存区(但库的实际实现中没有用临时内存区); 而memcpy的行为在src与dest的重叠内存区上是未定义的,但memcpy往往比memmove更快一些。 下面我们来自己实现它们: ; ; /* memcpy Algorithm: */ ; ; void * memcpy(void * dst, void * src, size_t count) ; { ; void * ret = dst; ; ; ; while (count--) ; *dst++ = *src++; ; /* 返回dst的指针 */ ; return(ret); ; } ; /* memmove Algorithm: */ ; ; void * memmove(void * dst, void * src, size_t count) ; { ; void * ret = dst; ; ; if (dst <= src || dst >= (src + count)) { ; /* 当没有重叠内存区域时 */ ; while (count--) ; *dst++ = *src++; ; } ; else { ; /* 当出现重叠内存区域时 */ ; dst += count - 1; ; src += count - 1; ; ; while (count--) ; *dst-- = *src--; ; } ; ; return(ret); ; } 以上我只写了一个简单的实现,想更深入理解,请参阅: 《The Standard C Library》/*库作者讲述库的实现*/ 《C语言接口与实现》 |
|