一,memcpy实现:
void* my_memcpy(void* dest, void* src, size_t n) { void* ret = dest; assert(dest && src); //保证数据的有效性。 while (n--) { *(char*)dest = *(char*)src; dest = (char*)dest + 1; src = (char*)src + 1; } return ret; }
我们来分析一下:
1.函数参数类型时void*是因为我们不知道需要拷贝数据的具体类型。而void时无具体类型,可以接受任意类型的参数。
2.其中我们转换位char* 时char*解引用访问一个字节,以他位最小单位,就可以拷贝任意类型的数据了。
3.最后的返回值是为了保证链式访问,所谓链式访问其实就是一个函数的返回值可以作为另一个函数的参数。
二,memmove
memcpy最大的问题是如果自己对自己 *** 作,又是会发生覆盖的问题从而导致结果出错,而memmove就是解决了这个问题。
void* my_memmove(void* dest,void* src,size_t n) { void* ret = dest; //这里分情况时为了针对自己对自己。 assert(dest&&src); if(dest分析:主要是通过从前往后拷贝和从后往前拷贝解决了自己给自己的覆盖问题。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)