上一篇介绍了字符串函数,并对一些函数进行了模拟实现了。但这些函数也只能对字符串进行操作,如果想对int型数组或者其他数据进行类似操作怎么办?这篇介绍的内存函数就能实现,同样的,也会对一些函数进行模拟实现
目录
1.memcpy
1.1函数介绍
1.2memcpy函数模拟实现
2.memmove
2.1函数介绍
2.2memmove函数模拟实现
3.memcmp
3.1函数介绍
3.2memcmp函数模拟实现
1.memcpy
1.1函数介绍
内存拷贝
从src位置开始向后的count个字节的数据拷贝到dest的位置,结果返回dest的地址
需要注意的是:对于dest和src位置有重叠的情况,C语言并没有对memcpy进行规定
1.2memcpy函数模拟实现
void* i_memcpy(void* dest, const void* src, size_t num)
{
assert(dest && src);
void* ret = dest;
while (num)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;//程序到这里dest的类型依旧是void*,所以不能直接++
src = (char*)src + 1;
num--;
}
return ret;
}
2.memmove
2.1函数介绍
功能和memcpy类似,不过memmove可以处理dest和src地址有重叠的情况?
2.2memmove函数模拟实现
void* i_memmove(void* dest, const void* src, size_t num)
{
void* ret = dest;
assert(dest && src);
if (dest < src)
{
//dest的地址在前面,拷贝方向从前向后
while (num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else
{
//dest地址和src相等,任意方向拷贝均可,dest在src后面,从后向前拷贝
while (num--)
{
*((char*)dest+num) = *((char*)src + num);
}
}
return ret;
}
3.memcmp
3.1函数介绍
比较从buf1和buf2开始的向后的count个字节的内容的大小
*buf1>*buf2返回大于0的数
*buf1=*buf1返回0
*buf1<*buf2返回小于0的数
3.2memcmp函数模拟实现
int i_memcmp(const void* s1, const void* s2, size_t num)
{
assert(s1 && s2);
int i = 1;
while (*(char*)s1 == *(char*)s2)
{
if (i == num)
return 0;
s1 = (char*)s1 + 1;
s2 = (char*)s2 + 1;
++i;
}
return *(char*)s1 - *(char*)s2;
}
内存函数就介绍完毕
完
|