/***********************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
本文详细介绍了C语言标准库中的strcpy和memcpy函数的典型工业级实现,包括内存重叠的安全处理。重点阐述了如何避免内存重叠导致的程序崩溃,并提供了memmove函数用于更安全的数据复制操作。

548

被折叠的 条评论
为什么被折叠?



