/**********************
*C语言标准库函数strcpy的一种典型的工业级的最简实现
*返回值:目标串的地址。
*对于出现异常的情况ANSI-C99标准并未定义,故由实现者决定返回值,通常为NULL。
*参数:des为目标字符串,source为原字符串
*/
char
*
strcpy
(
char
* des,
const
char
* source)
{
char
* r=des;
assert
((des != NULL) && (source != NULL));
while
((*des++ = *source++)!=
'\0'
);
return
r;
}
strcpy没有内存重叠的检查,但是由于source是const的,当有内存重叠时使用strcpy函数则程序会崩溃。
void
*
memcpy
(
void
*dest,const void*src,size_t count)
{
assert
(dest!=NULL && src!=NULL);
char
* tmp=dest;
const
char
* s=src;
for
(
size_t
i=0;i<count;i++)
{
tmp[i]=s[i];
}
return
dest;
}
memcpy也没有对内存重叠做处理,使用这个函数的时候只有程序员自己保证源地址和目标地址不重叠
为了免受内存重叠的困扰,上面可以加上assert(dst<src || src+count<=dst)加以避免。
在库函数实现时,只有memmove考虑了内存重叠,其功能与memcpy相同,但其效率会差一些
;memmove - Copy source buffer to destination buffer
;
;Purpose:
; memmove() copies a source memory buffer to a destination memory buffer.
; This routine recognize overlapping buffers to avoid propogation.
; For cases where propogation is not a problem, memcpy() can be used.
;
; Algorithm:
;
; void * memmove(void * dst, void * src, size_t count)
; {
; void * ret = dst;
;
; if (dst <= src || dst >= (src + count)) {
; /*
; * Non-Overlapping Buffers
; * copy from lower addresses to higher addresses
; */
; while (count--)
; *dst++ = *src++;
; }
; else {
; /*
; * Overlapping Buffers
; * copy from higher addresses to lower addresses
; */
; dst += count - 1;
; src += count - 1;
;
; while (count--)
; *dst-- = *src--;
; }
;
; return(ret);
; }
;
;Purpose:
; memmove() copies a source memory buffer to a destination memory buffer.
; This routine recognize overlapping buffers to avoid propogation.
; For cases where propogation is not a problem, memcpy() can be used.
;
; Algorithm:
;
; void * memmove(void * dst, void * src, size_t count)
; {
; void * ret = dst;
;
; if (dst <= src || dst >= (src + count)) {
; /*
; * Non-Overlapping Buffers
; * copy from lower addresses to higher addresses
; */
; while (count--)
; *dst++ = *src++;
; }
; else {
; /*
; * Overlapping Buffers
; * copy from higher addresses to lower addresses
; */
; dst += count - 1;
; src += count - 1;
;
; while (count--)
; *dst-- = *src--;
; }
;
; return(ret);
; }
参考:http://bbs.csdn.net/topics/390251052
http://blog.csdn.net/uusad/article/details/5273762
http://blog.csdn.net/feitianxuxue/article/details/7195158