C语言:C语⾔内存函数


头文件: <string.h>

1. memcpy 使⽤和模拟实现

memcpy - 用于拷贝(复制)数组到另一个数组里

使用语法:

 void * memcpy ( void * destination, const void * source, size_t num );
                     |                    |                |
                     |                    |                要复制的字节数
                     |                   被复制数组起始位置(源内存块)
                     目标数组起始位置(目标内存块)    

三点注意;

  1. 函数memcpysource的位置开始向后复制num个字节的数据到destination指向的内存位置。
  2. 这个函数在遇到 ‘\0’ 的时候并不会停下来,遇到\0会一起复制
  3. 如果source和destination有任何的重叠,复制的结果都是未定义的。–不要在同一个数组中使用

使用举例:

#include <stdio.h>
#include <string.h>
int main()
{
  int arr1[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
  int arr2[10] = {0};
  memcpy(arr2, arr1, sizeof(int) * 10);
  int i = 0;
  for (i = 0; i < 10; i++)
  {
    printf("%d ", arr2[i]);
  }
  return 0;
}

运行结果:

1 2 3 4 5 0 0 0 0 0

memcpy函数的模拟实现:

void *memcpy(void *dst, const void *src, size_t count)
{
  void *ret = dst;
  assert(dst);
  assert(src);
  while (count--)
  {
    *(char *)dst = *(char *)src;
    dst = (char *)dst + 1;
    src = (char *)src + 1;
  }
  return (ret);
}
  • 用char * 一个一个字节复制,可以接受所有类型的复制

2. memmove 使⽤和模拟实现

memmove - 用于移动一个内存块到另一块内存块,在同一个数组中,源内存块和⽬标内存块是可以重叠的。

void * memmove ( void * destination, const void * source, size_t num );
					 |                    |                |
                     |                    |                要复制的字节数
                     |                   源内存块
                     目标内存块

使用:

#include <stdio.h>
#include <string.h>
int main()
{
  int arr1[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
  memmove(arr1 + 2, arr1, sizeof(int)*5);
  int i = 0;
  for (i = 0; i < 10; i++)
  {
    printf("%d ", arr1[i]);
  }
  return 0;
}

运行结果:

1 2 1 2 3 4 5 8 9 10

其复制时会判断情况:(不在同个数组时,其用法与memcpy一致)

  • 在同一个数组时,如果sourcedestination之后,或者source+count的之后到达不了destination,就会正常的从前往后一个字节一个字节的打印
  • 除此之外,memmove都会从后往前一个字节一个字节打印

memmove的模拟实现:

void *memmove(void *dst, const void *src, size_t count)
{
  void *ret = dst;
  if (dst <= src || (char *)dst >= ((char *)src + count))
  {
    while (count--)
    {
      *(char *)dst = *(char *)src;
      dst = (char *)dst + 1;
      src = (char *)src + 1;
    }
  }
  else
  {
    dst = (char *)dst + count - 1;
    src = (char *)src + count - 1;
    while (count--)
    {
      *(char *)dst = *(char *)src;
      dst = (char *)dst - 1;
      src = (char *)src - 1;
    }
  }
  return (ret);
}

3. memset 函数的使用

memset - 用于直接设置一段内存为相同的数,一般用于初始化

void * memset ( void * ptr, int value, size_t num );
					 |            |          |
                     |            |          要复制的字节数
                     |            设置初始化的数
                     目标内存块

使用:

#include <stdio.h>
#include <string.h>
int main ()
{
 char str[] = "hello world";
 memset (str,'x',6);
 printf(str);
 return 0;
}

运行结果:

xxxxxxworld

4. memcmp 函数的使用

memcmp - 用于比较两段内存(数组)

int memcmp ( const void * ptr1, const void * ptr2, size_t num );
					 |            |                 |
                     |            |                 要比较的字节数
                     |            比较者b
                     比较者a
  • 其比较是一个字节一个字节的比较的,遇到不同就会返回
  • a > b 时 , 返回 >0
  • a < b 时 , 返回 <0
  • a 完全等于b , 返回 0

使用:

#include <stdio.h>
#include <string.h>
int main()
{
 char buffer1[] = "DWgaOtP12df0";
 char buffer2[] = "DWGAOTP12DF0";
 int n;
 n = memcmp(buffer1, buffer2, sizeof(buffer1));
 if (n > 0) 
 printf("'%s' is greater than '%s'.\n", buffer1, buffer2);
 else if (n < 0) 
 printf("'%s' is less than '%s'.\n", buffer1, buffer2);
 else
 printf("'%s' is the same as '%s'.\n", buffer1, buffer2);
 return 0;
}

感谢你能看到这里!!喜欢的话点个👍吧 !,拜托了,这对我真的很重要!!

  • 15
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值