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

之前实现过一些字符串操作函数,在C标准库中还有一些操作内存的函数

1、 memset

这个函数是用来设置内存内容的,平时我们可以利用它来初始化一段连续空间。
要注意的是这个函数的后两个参数,第二个参数是int,但是具体使用的时候用的是char类型,第三个参数是你要设置内存的大小,以字节为单位。

void* my_memset(void* buf, int value, size_t num)
{
      char* su = (char*)buf;
      char ch = value;
      for (int i = num; i >0; --i)
      {
            *su = ch;
            su++;
      }
      return buf;
}

2、 memcpy

这个函数是用来拷贝内存内容的函数,用来拷贝src所指的内存内容前n个字节到dest所指的内存上,它不像strcpy一样,遇到’\0’就停止拷贝,它会复制完n个字节
注:dest和src所指的内存区域不可重叠

void* my_memcpy(void* dest, void* src, size_t n)
{
      void* res = dest;
      while (n--)
      {
            *(char*)dest = *(char*)src;
            dest = (char*)dest + 1;
            src = (char*)src + 1;
      }
      return res;
}

3、 memmove

memmove函数同样是可以进行内存拷贝的,但是和memcpy不同的是,当dest和src重叠时,memmove依然可以处理,不过指向的效率比memcpy要慢

void* my_memmove(void* dest, void* src, size_t n)
{
      void* res = dest;
      if (dest <= src || (char*)dest >= (char*)src + n) 
      //缓冲区没有重叠,从前向后拷贝
      {
            while (n--)
            {
                  *(char*)dest = *(char*)src;
                  dest = (char*)dest + 1;
                  src = (char*)src + 1;
            }
      }
      else //缓存区有重叠,从后向前拷贝
      {
            dest = (char*)dest + n + 1;
            src = (char*)src + n + 1;
            while (n--)
            {
                  *(char*)dest = *(char*)src;
                  dest = (char*)dest - 1;
                  src = (char*)src - 1;
            }
      }
      return res;
}

4、memcmp

该函数是用来进行内存比较的函数,比较buf1和buf2的前n个字节。

  • 当buf1 < buf2,返回值 < 0
  • 当buf1 = buf2,返回值 = 0
  • 当buf1 > buf2,返回值 > 0

该函数是按字节进行比较的

int my_memcmmp(const void* buf1, const void* buf2, size_t n)
{
      int res = 0;
      const char* p1 = (const char*)buf1;
      const char* p2 = (const char*)buf2;
      while (n--)
      {
            res = *p1 - *p2;
            if (*p1 != *p2)
                  break;
            p1++;
            p2++;
      }
      return res;
}

5、 memchr

该函数是从buf所指内存的前n个字节查找字符ch第一次出现的位置,然后返回这个位置,不存在就返回NULL

void* my_memchr(const void* buf, int ch, size_t n)
{
      assert(buf);
      const char* p = (const char*)buf;
      while (n--)
      {
            if (*p != (char)ch)
                  p++;
            else
                  return p;
      }
      return NULL;
}

在这里对这些函数就不一个个检测了,读者可以自行测验

猜你喜欢

转载自blog.csdn.net/qq_34021920/article/details/81289622
今日推荐