memmove、memcpy、strcpy、memset
原型为:
void *memmove( void* dest, const void* src, size_t count );
char* strcpy(char* dest, const char* src);
void *memcpy(void *dest, const char* src, size_t count);
void* memset(void* dest, int value, size_t num)。
(1)strcpy提供了字符串的复制。
即strcpy只用于字符串复制,并且它不仅复制字符串内容外,还会复制字符串的结束符。
(2)memcpy只提供一般的内存复制,即memcpy对于需要复制的内容没有限制,因此用途更广。
(3)复制的内容不同。
strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符串、整型、结构体、类等。
(4)复制的方法不同。
strcpy不需要指定长度,它遇到被复制字符串的结束符" ”才结束,所以容易溢出。memcpy则是根据第3个参数决定复制的长度。
(5)用途不同。
通常在复制字符串时用strcpy,而需要复制其它类型的数据是用memcpy。
(6)memcpy只是memmove的一个子集,memmove在copy两个有重叠区域的内存时可以保证copy的正确,而memcopy就不行了,但memcopy比memmove的速度要快一些。
memcpy的实现:
1 //size_t指的是unsigned int 2 char* memcpy(void* dest,const void* src, size_t num) 3 { 4 char* p_dest = (char*)dest; 5 const char* p_src = (const char*)src;
6 assert((dest != NULL) && (src != NULL) && (dest != src)); 7 while(num-- > 0) 8 *p_dest++ = *p_src++; 9 return dest; 10 }
strcpy的实现:
1 char* strcpy(char* dest, const char* src) 2 { 3 assert((dest!=NULL) && (src!=NULL) && (dest!=src)); 4 char* address = dest; 5 while(*dest++ = *src++ ) 6 NULL; 7 return address; 8 }
memmove的实现:
1 char* memmove(void* dest, const void* src,size_t num) { 2 assert((dest!=NULL) && (src!=NULL) && (dest!=src)); 3 char* p_dest = (char*)dest; 4 const char* p_src = (const char*)src; 5 6 if(p_dest > p_src && p_dest < p_src + num) //内存有重叠,逆向拷贝 7 { 8 p_dest += num - 1; 9 p_src += num - 1; 10 while(num--) 11 *p_dest-- = *p_src--; 12 } 13 else 14 { //p_dest<=p_src,此时无论是否重叠都可以使用正向拷贝 15 while(num--) 16 *p_dest++ = *p_src++; 17 } 18 return dest; 19 }
memset的实现:
1 char* memset(void* dest, int value, size_t num) 2 { 3 assert(dest != NULL); 4 unsigned char* p_dest = (unsigned char*)dest; 5 while(num-- > 0) 6 *p_dest++ = (unsigned char)value; 7 return dest; 8 }