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不需要指定长度,它遇到被复制字符串的结束符"”才结束,所以容易溢出。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 }
原文地址:https://www.cnblogs.com/cpsmile/p/4426028.html