小总结----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的指针进行算法操作,这是错误的做法!!!