memcpy——拷贝函数
void * memcpy ( void * destination, const void * source, size_t num );
- 函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。
- 这个函数在遇到 '\0' 的时候并不会停下来。
- 如果source和destination有任何的重叠,复制的结果都是未定义的。
void* my_memcpy(void* dst, const void* src, size_t n)
{
assert(dst && src);//防止空指针
void* ret = dst;
while (n--)
{
*(char*)dst = *(char*)src;
//1
dst= (char*)dst+1;
src= (char*)src+1;
//2 也可以用下面这种
++(char*)dst;
++(char*)src;
}
return ret;
}
memmove——可以实现自己拷贝自己
void * memmove ( void * destination, const void * source, size_t num );
- 和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
- 如果源空间和目标空间出现重叠,就得使用memmove函数处理
- num指的是要拷贝多少字节
void* my_memmove(void* dst, const void* src, size_t num)
{
assert(dst && src);
char* ret = dst;
if (dst < src)//从前往后拷贝
{
while (num--)
{
*(char*)dst = *(char*)src;
++(char*)dst;
++(char*)src;
}
}
else if (dst > src)
{
while (num--)//从后往前拷贝
{
*((char*)dst + num) = *((char*)src + num);
}
}
return ret;
}
memcmp——比较大小
int memcmp ( const void * ptr1,const void * ptr2,size_t num );
- 比较从ptr1和ptr2指针开始的num个字节
- 返回值如下:
int my_memcmp(const void* buf1, const void* buf2, size_t num)
{
assert(buf1 && buf2);
while (num--)
{
if (*(char*)buf1 == *(char*)buf2)
{
++(char*)buf1;
++(char*)buf2;
}
return *(char*)buf1 - *(char*)buf2;
}
}