模拟库函数memcpy
函数原型:
void *memcpy( void *dest, const void *src, size_t count );
函数功能:
memcpy函数是从源字符串中取前count个地址字符放入到目标字符串前count个地址位置,目标字符串前count个地址原有字符将被覆盖。
memcpy还可以操作数组元素。
模拟实现(第一次写的漏洞):
char *my_memcpy(char *dest, const char *src, size_t count)
{
char *ret = dest;
assert(NULL != dest);
assert(NULL != src);
while (src != '\0' && count)
{
*(dest++) = *(src++);
count--;
}
return ret;
}
以上实现方法类似strncpy函数,只能操作字符串,为了实现memcpy所有功能,这样实现。
最终版:
void *my_memcpy(void *dest, void *src, size_t count)
{
char *p1 = (char *)dest;
char *p2 = (char *)src;
char *ret = p1;
while (count--)
{
*p1 = *p2;
p1++;
p2++;
}
return ret;
}
模拟库函数memmove
函数原型:
void *memmove( void *dest, const void *src, size_t count );
函数功能:
扫描二维码关注公众号,回复:
2399975 查看本文章
函数有三个参数,目标位置,源位置,count(内存移动个数),函数实现由src所指内存区域复制count个字节到dest所指内存区域
对于内存移动分为两种情况:
1、内存有重叠区:
2、内存没有重叠区:
源码实现:
void *my_memmove(void *dest, void *src, size_t count)
{
assert(NULL != dest);
assert(NULL != src);
char *pdest = (char *)dest;
char *psrc = (char *)src;
if (psrc < pdest && pdest < psrc + count) //内存有重叠
{
cout << "内存重叠" << endl;
while (count--)
*(pdest + count) = *(psrc + count);
}
else
{
cout << "内存没有重叠" << endl;
while (count--)
*pdest++ = *psrc++;
}
return dest;
}