C/C++ memmove、memcpy、strcpy、memset的实现
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不需要指定长度,它遇到被复制字符串的结束符"\0”才结束,所以容易溢出。memcpy则是根据第3个参数决定复制的长度。
(5)用途不同。
通常在复制字符串时用strcpy,而需要复制其它类型的数据是用memcpy。
(6)memcpy只是memmove的一个子集,memmove在copy两个有重叠区域的内存时可以保证copy的正确,而memcopy就不行了,但memcopy比memmove的速度要快一些。
memcpy的实现:
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 }
浙公网安备 33010602011771号