小总结----memcpy()的实现

 对memcpy的理解和小总结

原型:void *memcpy(void *dest, const void*src, size_t len)

别bb,直接看source code.
source code:

 1 void *my_memcpy(void *mpTo, const void*mpFrom, size_t len)
 2 {    
 3   if((NULL == mpFrom) || (NULL == mpTo))    //用来判断字符是否有效
 4   {
 5   return NULL;    //如果字符无效就返回
 6   }
 7 
 8/**************** 看提醒,理解为啥这样干 ************/
 9   unsigned char *tempFrom = (unsigned char*)mpFrom; 
10   unsigned char *tempTo = (unsigned char*)mpTo;    
11 /****************************************************/
12 
13   while(len--)
14   {
15     *tempTo++ = *tempFrom++;    
16   }
17   return tempTo;
18 }

 


memcpy函数功能:
①memcpy函数拷贝n个字节从内存中的src到dest的内存区域中。内存区域不能有重叠,如果有重合,要使用memmove函数。

② memcpy 函数用于 把需要拷贝的内存(mpFrom所指向的内存区域) 拷到需要内存(mpTo所指向的内存区域);len变量是用来表示拷贝多少字节,一般会使用sizeof,或者strlen计算出len的值,两种方法这也是需要注意的一个重点, clearly! just a '/0'.

 

用法:可以拷贝任何类型的对象,因为函数的参数类型是void*(任意类型指针).

提醒:
①:如果直接进行*mpFrom++ = *mpTo++; 这样就是对void的指针进行算法操作,这是错误的做法!!!
②:函数拷贝的过程是一个字节一个字节的拷贝的,所以实际操作的时候要把void*强制转化为 unsigned char*,这样在指针加的时候才会保证每次加一个字节.

函数使用方法:

 1 int main(int argc, char** argv)
 2 {
 3     const char src[] = "mk";    
 4     char dest[] = "abcdef";
 5 
 6     my_memcpy(dest, src, strlen(src));
 7     printf("%s\n", dest);    //mkcdef
 8 
 9     return 0;
10 }

 

注意:

①使用sizeof和strlen的区别:'\0'.具体的sizeof和strlen不多说.

如果使用sizeof计算len;如下:

 1 int main(int argc, char** argv)
 2 {
 3     const char src[] = "mk";
 4     char dest[] = "abcdef";
 5 
 6     my_memcpy(dest, src, sizeof(src));
 7     printf("%s\n", dest); //mk
 8 
 9     return 0;
10 }

 


②void*一定要有一个返回值,和void是不一样的.

 所以原型不要写错成:

void my_memcpy(void *mpTo, const void*mpFrom, size_t len)

 

③再次提醒:如果直接进行*mpFrom++ = *mpTo++; 这样就是对void的指针进行算法操作,这是错误的做法!!!

 

posted on 2015-12-14 22:48  岳睿_02  阅读(619)  评论(0编辑  收藏  举报

导航