版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
memmove长度受限制的可以重叠的复制
void *my_memmove(void * dst, const void *src, size_t num)
{
void *start = src;
if (dst <= src || (char *)dst >= ((char *)src + num))//前覆盖或者没有覆盖 ,从前往后覆盖
{
while (num--)
{
*(char*)dst = *(char*)src;
((char *)dst)++;
((char *)src)++;
}
}
else//后覆盖,从后往前复制
{
dst = (char *)dst + num - 1;
src = (char *)src + num - 1;
while (num--)
{
*(char*)dst = *(char*)src;
dst = (char *)dst - 1;
src = (char *)src - 1;
}
}
return start;
}
int main()
{
int src[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
my_memmove(src+3, src, 16);
for (int i = 0; i < 8; i++)
{
printf("%d", src[i]);
}
}
memcpy长度有限的字节拷贝遇到’\0’不会停止,从src后复制num个字节的数据给dst,如果src和dst有任何的重叠,复制的结果是未定义的
void *my_memcpy(void* dst, const void* src, size_t num)
{
void *start = dst;
//*((char*)(dst)+num) = '\0';
while (num--)
{
*(char *)dst = *(char *)src;
((char*)dst)++;
((char*)src)++;
}
return (start);
}
int main()
{
char src[] = { 1, 2, 3, 4, 5, 6 };
char dst[20] = { 0 };
my_memcpy(dst,src+2, 16);
for (int i = 0; i < 4; i++)
{
printf("%d", dst[i]);
}
}