目录
一、memcpy的使用和模拟实现
1.memcpy的使用
memcpy是一个用于内存复制的函数,我们知道strcpy是拷贝字符的,而memcpy不仅可以拷贝字符,还可以整型数据、浮点型数据、结构体等,因此其参数以及返回类型都是void*。
注意:
⭐num(第三个参数)单位是字节
⭐这个函数在拷贝过程中遇到'\0'并不会停下来
⭐如果source和destination有任何的重叠,复制的结果都是未定义的(在C语言中规定,memcpy拷贝的就是不重叠的内存,memmove拷贝的是重叠的内存,但是在vs2022中memcpy也是可以实现重叠拷贝)
接下来给个使用memcpy的例子来看:
2.memcpy的模拟实现
思路很简单,一个字节一个字节地拷贝,然后每次让num--。
代码如下:
void* 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;
}
二、memmove的使用和模拟实现
1.memmove的使用
memmove的作用也是拷贝,当目标区域与源区域没有重叠时,memmove的作用与memcpy一样,但是当目标区域与源区域重叠时,则必须使用memmove。
2.memmove的模拟实现
草图分析:
为了简便,我们写代码时就直接将dest在src的情况(对应第一个和第四个)采用从前到后拷贝,另外两种就从后到前拷贝。
代码如下:
void* my_memmove(void* dest, const void* src, size_t num)
{
void* ret = dest;
assert(dest && src);
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); //dest、src依次加上num-1 num-2...
}
}
return ret;
}
三、memset的使用
memset是用来设置内存的,将内存中的值以字节为单位设置成想要的内容。
示例如下:
四、 memcmp的使用
memcmp与strcmp类似,但是不仅可以比较字符,还可以比较整型、浮点型等,memcmp函数比较从ptr1和ptr2指针指向的位置开始,向后的num个字节,若完全一样则返回0,若在比较途中*ptr1>*ptr2则返回一个大于0的数,若小于则返回一个小于0的数。