目录
一、memcpy函数
1、描述
C 库函数 void *memcpy(void *dest, const void *src, size_t count) 从存储区 src 复制 count 个字节到存储区 dest。
注:返回值:.src和dest所指内存区域不能重叠,函数返回指向dest的指针。
2.实现
void* my_memcpy(void* dest, const void* src, size_t count)
//count的单位实际上是字节
{
assert(dest && src);
void* ret = dest;//因为返回值为void指针
while (count--)
{
*(char*)dest = *(char*)src;
//char类型的指针为一个字节,因此我们不管拷贝对象是什么类型我们只需要给他转换成多少字节就可以
//也就是我们需要的size_t count
dest = (char*)dest + 1;//强制类型转换
src = (char*)src + 1;
}
return ret;
}
二、memmove函数
1、描述
C 库函数 void *memmove(void *dest, const src *str2, size_t count) 从 src 复制 count 个字符到 dest,但是在重叠内存块这方面,memmove() 是比 memcpy() 更安全的方法。如果目标区域和源区域有重叠的话,memmove() 能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,复制后源区域的内容会被更改。如果目标区域与源区域没有重叠,则和 memcpy() 函数功能相同。
2、实现
关于memmove函数的实现我们得分情况讨论,因为我们是把数据从一个缓冲区转移到另外一个缓冲区,因此我们得分情况讨论,因为数组的地址是从低到高,因此我们可以利用指针地址的大小来分情况讨论,也就是dest > src和src > dest的时候,当src > dest 因为我们的数据不会重叠因此我们只需要和memcpy一样实现从前往后拷贝就好了,但是当dest > src的时候就不一样了,因为我们的数据会重叠,因为我们需要从后往前来实现拷贝。
void* my_memmove(void* dest, const void* src, size_t count)
{
assert(dest && src);
void* ret = dest;
if (dest < src)
{
//从前往后
while (count--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;//强制类型转换
src = (char*)src + 1;
}
}
else
{
//从后向前
while (count--)
{
*((char*)dest +count)= *((char*)src + count);
}
}
return ret;
}