一、strcpy和memcpy都是標準C庫函數,它們的區別如下:
1、複製的內容不同。strcpy只提供了字符串的複製;而memcpy一般提供內存的複製,即對所要複製的內容沒有限制,例如:字符串、整型、結構體、類等。
2、函數原型不同。strcpy的函數原型爲:char *strcpy(char *dest,const char *src);memcpy的函數原型爲:void *memcpy(void *dest,const void *src,size_t count);
3、複製方法也不同。strcpy不需要指定長度,它遇到‘\0’便會停止,所以容易溢出;memcpy則是根據第三個參數決定複製的長度。
4、用途不同:strcpy通常用於複製字符串;memcpy通常用於複製其他類型的數據。
二、memcpy和memmove都是標準C庫函數,在庫函數string.h中,它們都是從src所指向的內存中複製count個字節到dest所指向的內存中,並返回dest的值。
1、memcpy
1>函數原型:void *memcpy(void *dest,const void *src,size_t count);
2>函數實現:
void *my_memcpy(void *dest, const void *src, size_t count) { char *pDest = (char *)dest; char *pSrc = (char *)src; assert(dest); assert(src); while (count--) { *pDest++ = *pSrc++; } return dest; }
3>函數說明:memcpy和memmove的功能相同,但是memcpy不能處理重疊。
2、memmove
1>函數原型:void *memmove(void *dest,const void *src,size_t count);
2>函數實現:
void * MyMemMove(void *dst, const void *src, int count) { assert(dst); assert(src); void * ret = dst; if (dst <= src || (char *)dst >= ((char *)src + count)) { while (count--) { *(char *)dst = *(char *)src; dst = (char *)dst + 1; src = (char *)src + 1; } } else { dst = (char *)dst + count - 1; src = (char *)src + count - 1; //逆序拷貝 while (count--) { *(char *)dst = *(char *)src; dst = (char *)dst - 1; src = (char *)src - 1; } } return(ret); }
3>函數說明:memmove用於從src中拷貝count個字符到dest中,如果目標區域和源區域
有重疊時,memmove能夠保證源串在被覆蓋之前將重疊區域的字節拷貝到目標區域中。