C语言:@ 模拟实现内存操作函数(memcpy、memset、memcmp、memmove)

本文介绍了C语言中以mem开头的内存操作函数,包括memcpy用于内存拷贝,memset用于将内存区域设置特定值,memcmp用于比较内存区域,以及memmove处理可能重叠的内存拷贝。这些函数均以字节为基本操作单位,void*参数确保了类型无关性。
摘要由CSDN通过智能技术生成

以mem开头的函数,其操作以字节为基本单位,与类型无关(因为参数都为void*,即接收所有类型)

  • void 不能定义变量,因为不同的编译器中规定的大小不同
  • void*可以定义变量,它也是指针,大小为4或8,但不能解引用,解引用后为void,就不知道指针指向的是谁了
  • void*一般用来用来传值,可以接收任意类型,常见用来接收地址类型

memcpy 内存拷贝

void *my_memcpy(void *dst, void *src, int num)
{
 assert(dst);
 assert(src);
 //得有一个容器
 char *dst_p = (char*)dst;//强转成char*   因为以字节为单位,char 占一个字节
 char *src_p = (char*)src;
 //拷num个字节,循环一次拷一个
 while (num--)
 {
  *dst_p = *src_p;
  dst_p++, src_p++;
 }
 return dst;
}
int main()
{
 char *arr = "hello world";
 char arr1[32];
 my_memcpy(arr1, arr, strlen(arr)+1);//按字节拷贝 +1是给结尾带'\0'
 system("pause");
 return 0;
}

memset 将内存中每个字节的内容设置为特定的值

void *my_memset(void *arr, int value, size_t num)
{
 assert(arr);
 char *dst = (char*)arr;
 size_t i = 0;
 for (; i < num; i++)
 {
  *(dst + i) = (char)value;
 }
 return arr;
}

 int main()
{
 int arr2[] = { 1, 2, 3, 4, 5 };
 int sz = sizeof(arr2) / sizeof(arr2[0]);
 my_memset(arr2, 0, sizeof(arr2));//置为0
 for (int i=0; i < sz; i++)
 {
  printf("%d", arr2[i]);
 }
 printf("\n");
 system("pause");
 return 0;
}

memcmp 内存比较

int my_memcmp(const void *dst,const void *src, int num)
{
 assert(dst);
 assert(src);
 char *p1 = (char*)dst;
 char *p2 = (char*)src;
 while (num&&*p1 == *p2)
 {
   p1++; 
   p2++;
   num--;
 }
 if (*p1 > *p2)
 {
  return 1;
 }
 else if (*p1<*p2)
 {
  return -1;
 }
 return 0;
 
int main()
{
 const char *a1 = "abcdef";
 const char *a2 = "def";
 int ret = my_memcmp(a1, a2, 3);
 printf("%d\n", ret);
 system("pause");
 return 0;
}

memmove 内存拷贝

void *my_memmove(void *dst, void *src, size_t num)
{
 assert(dst);
 assert(src);
 char *dst1 = (char*)dst;
 char *src1 = (char*)src;  
 //dst一定要比src大
 //dst>src 说明dst在src的后面  dst<src+num  说明dst在src和src+num之间,也就是这个长度之间,num是src的长度
 if ((dst1 >= src1) || (dst1<=src1+num))
 {
 	//从右向左
   dst1 = dst1 + num - 1;
   src1 = src1 + num - 1;
   while (num--)
   {
    *dst1 = *src1;
    dst1--, src1--;
   }
 }
 else
 { 
  //从左向右拷
  while (num--)
  {
   *dst1 = *src1;
   dst1++, src1++;
  }
 }
 return dst1;
}
int main()
{
  char dst[] = "abcdef";
  char src[] = "cdefgh";
  my_memmove(dst+1, src, strlen(dst) + 1);
  printf("%s\n", dst);
  system("pause");
  return 0;
}
  • 与memcpy的区别就是memmove函数处理的源内存块的目标内存块是可以重叠的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值