void *memcpy(void *dest, const void *src, size_t n)
功能:从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置处。
函数说明:
1> src 和 dest 所指的内存区域可能重叠,但是如果src 和 dest 所指的内存区域重叠,memcpy()函数并不能确保src所在重叠区域在被拷贝之前不被覆盖,这种情况可以使用memmove()函数,该函数可以有效除以重叠区域。
2> 如果dest本身有数据,执行memcpy()之后,将会覆盖dest的原有数据,若要追加数据,则每次执行完memcpy()函数后,要将目标数组的地址追加到想要追加数据的地址。
返回值: 返回指向dest的指针。
注意: src 和 dest 都不一定是数组,任意的可读写空间都可以
void *my_memcpy(void *dest, const void *src, size_t n)
{
if(dest == NULL || src == NULL || n <= 0)
{
return dest;
}
char *dt = dest;
const char *sr = src;
while(n--)
{
*dt++ = *sr++;
}
return dest;
}
void *memmove(void *dest, const void *src, size_t n);
功能: 从src所指的内存区域的首地址拷贝n个字节到dest所指的内存区域的首地址。
函数说明: 若src 和 dest有重叠的话,memmove() 函数可以确保重叠区域的字符在被覆盖之前拷贝。 不过复制后的src的内容被改变。
返回值: 返回指向dest的指针。
void *my_memmove(void *dest, const void *src, size_t n)
{
if(dest == NULL || src == NULL || dest == src)
{
return dest;
}
char *dt = dest;
const char *sr = src ;
if((dt < sr) && ((dt - sr) < n))
{
while(n--)
{
dt[n] = sr[n];
}
}
else
{
while(n--)
{
*dt++ == *sr++;
}
}
return dest;
}