memcpy是内存拷贝函数,可以用来拷贝字符串,整形数组,结构体数据等等,下面是具体的用法
void * memcpy ( void * destination, const void * source, size_t num );
menmcpy的参数由一个void*类型的目标形参和一个不可更改的源void*形参以及一个更改字节个数的形参三部分组成,它可以用来复制一个内存块,将num个bytes从指向源地址的数据更改到指向目标地址的数据。(详情请参考cplusplus.com/reference/cstring/memcpy/)
memmove和memcpy一样,同样是内存函数,用法是跟memcpy相同的,但是需要注意的是,memcpy是先修改再使用,重叠拷贝时会出错,这时就可以使用memmove函数来解决以上问题,下面是具体用法
和memcpy一样函数的参数都是相同的,不同点就在于memcpy是直接复制,而memmove是复制之后再移动,相当于是缓冲区,允许重叠.
(详情参考cplusplus.com/reference/cstring/memmove/)
memcmp函数是内存比较函数,它可以比较的是内存中储存的数据的大小,使用方法如下
memcmp函数使用时同样具有三个形参,两个const修饰的void*类型的形参和一个需要比较的字节数的大小,若前一个字节小于后一个字节,则会返回一个小于0的整数,若相等则会返回0,若大于则会返回一个大于0的整数。
(详情参照cplusplus.com/reference/cstring/memcmp/)
下面是一个memcmp的案例。
左图中是数组a的地址,右图是数组b的地址,在进行比较的时候,memcmp会一个字节一个字节的向下进行比较,当比较到0x0095FB3C和0x006FFC58时,此时b数组的元素为04,而a数组的元素为03,前一个字节要小于后一个,此时memcmp会返回一个值给ret,下面是代码的运行结果。
由此我们可以看出,以上的三个函数和字符串函数的用法非常相似,那么我们是不是可以举一反三,通过模拟来实现这几个内存修改的函数呢?
当然可以!
那么就不多做解释,直接上代码
memcpy的模拟函数
my_memcpy(void* dest, void* src, size_t num)
{
void* ret = dest;
assert(dest && src);
while (num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}
想要对内存进行复制,直接将源形和目标形参通过强制转换成 char* 类型然后一个字节一个字节的赋给目标形参就行了,然后再将目标形参和源形参向后移动一个字节就可以实现,是不是非常的简单
memmove 的模拟函数
void* my_memmove(void* dest, void* src, size_t num)
{
void* ret = dest;
if (dest < src)
{
while (num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else
{
while (num--)
{
*((char*)dest + num) = *((char*)src + num);
}
}
return ret;
}
这里通过对dest和src的比较来判断是从前往后进行复制还是从后往前进行复制,若是小于则是从前往后进行复制,若是大于则是从后往前进行复制。然后用一个ret储存一下目标形参最后返回。
以上就是对内存函数的介绍以及简单的模拟,由于某些原因导致前面的有点拖更,后期会加班补上。
最后如果喜欢的话别忘了点赞关注评论一波,感谢佬的三连支持