文章目录
前言
本文主要介绍memcpy函数、memmove函数、memcmp函数,以及memcpy函数与memmove函数的模拟实现。
一、memcpy函数
1.memcpy函数基本介绍
初学memcpy函数可能会有疑惑,为什么有strcpy函数还需要memcpy函数,实际上strcpy是用来复制字符的,但是,memcpy什么类型的数据都可以复制。
memcpy函数的三个参数分别是指向需要复制数据位置的指针,指向待复制数据的指针,以及要复制的字节数。
使用实例如下:
#include<ctype.h>
#include<string.h>
int main()
{
int arr[] = {1,2,3,4};
int arr1[5] = {0};
memcpy(arr1,arr,16);
return 0;
}
注意:第三个参数是字节数,所以应该传入要复制的元素个数与元素类型的所占字节数的乘积。
2.memcpy函数的模拟实现
void* my_memcpy(void* dest, const void* src,size_t sz)
{
assert(dest && src);
void* ret = dest;
while(sz--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}
模拟函数也和memcpy函数使用一样的参数,void* 类型和const void* 都可以接收任何类型的指针。传入两个指针后按照需要复制的字节数通过循环完成复制。因为是按字节复制的,所以指针每次只能增加一字节,复制一字节,因此在解引用进行复制时要首先将指针类型转为char* 类型,这样才只会取出一字节的数据,指针加一时也是一样的道理,为了使加一的操作只加一个字节,需要先将指针转为char* 类型。
二、memmove函数
1.memmove函数基本介绍
memmove函数的参数与memcpy基本类似,不多做介绍。
memmove函数与memcpy函数的区别在于memmove函数可用于处理内存重叠的复制情况,而memcpy函数不可,但是这是一种标准,实际上在内存重叠的情况下使用memcpy函数进行复制仍然能够成功运行(前面模拟实现的memcpy函数显然处理不了内存重叠这种情况下的复制)。
这里稍微介绍一下内存重叠的复制情况。类似于下图这种,将34567复制至12345的位置。
2.memmove函数的模拟实现
void my_memmove(void* dest, const void* src, size_t sz)
{
assert(dest && src);
void* ret = dest;
if (dest < src)
{
for(int i=0;i<sz;i++)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else
{
while (sz--)
{
*((char*)dest + sz) = *((char*)src+sz);
}
}
return ret;
}
这里分为了两种情况,第一种是当内存重叠时进行复制,按字节从前往后复制,第二种是按字节从后往前复制。
三、memset函数
memset函数的三个参数分别是指向待操作数据的指针,要给每个字节设置的值以及设置的字节数。即根据传入的指针和字节数对每个字节的值进行设置。
四、memcmp函数
基于我个人的理解,memcmp函数与strcmp函数类似,都是传入两个指针,根据指针指向的数据进行比较,不过memcmp会按字节对数据进行比较,并且比较的数据类型不仅仅是字符类型。