C语言中的内存函数你知道多少呢?

简介: C语言中的内存函数你知道多少呢?

1. memcpy的使用和模拟实现


1.1函数介绍


注:使用该函数需要引用头文件#include<string.h>


1.2函数的使用


假设我们要将arr1中的前20个字节拷贝到数组arr2中~

int main()
{
  int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
  int arr2[10] = { 0 };
  memcpy(arr2, arr1, 20);
  for (int i = 0; i < 5; i++)
  {
    printf("%d ", arr2[i]);
  }
  return 0;
}

 

运行效果如下~

我们可以看到屏幕上打印了1 2 3 4 5 ~怎么样,使用是不是很简单呢?


1.3模拟实现


那让我们模拟实现一下这个函数,相信我们会对其有更加深刻的理解呢~


.  模拟实现之前我们还要了解一下指针类型void*

.  当我们无法确定传递过来的实参的指针是什么类型时,我们就可以用void*来接受

.  但我们还要知道的一点是对于指针void*,我们无法对其进行指针运算的

void* my_memcpy(void* dest, const void* src, size_t num)
{
  assert(dest && src);//判断指针的有效性
  void* ret = dest;//用ret记录dest目标函数的起始位置
  while (num--)
  {
    //强制类型转化为char*对其进行指针运算
    *(char*)dest = *(char*)src;
    dest = (char*)dest + 1;
    src = (char*)src + 1;
    //*((char*)dest)++ = *((char*)src)++;这种写法在VS2022上可行,但不能确保所有编译器上都可行
  }
  return ret;
}

2. memmove的使用和模拟实现


2.1函数介绍



2.2函数的使用

int main()
{
  int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
  int arr2[10] = { 0 };
  memmove(arr1+2, arr1, 20);
  for (int i = 0; i < 10; i++)
  {
    printf("%d ", arr1[i]);
  }
  return 0;
}


我们来看一下运行效果~


2.3模拟实现


那让我们模拟实现一下这个函数,相信我们会对其有更加深刻的理解呢~

void* my_memmove(void* dest, const void* src, size_t num)
{
  assert(dest && src);
  void* ret = dest;
  if (src>dest)//从前往后复制
  {
    while (num--)
    {
      *(char*)dest = *(char*)src;
      dest = (char*)dest + 1;
      src = (char*)src + 1;
    }
  }
  else//从后往前复制
  {
    dest = (char*)dest + num-1;
    src = (char*)src + num-1;
    while (num--)
    {
      *(char*)dest = *(char*)src;
      dest = (char*)dest - 1;
      src = (char*)src - 1;
    }
    //while (num--)
    //{
    //  *((char*)dest + num) = *((char*)src + num);
    //}这样写也行
  }
  return ret;
}


算法的图解放在下面啦~


3. memset函数的使用


3.1函数介绍



3.2函数的使用

int main()
{
  int arr[10] = { 0 };
  memset(arr, 1, 20);
  return 0;
}


调试我们看一下效果~

是不是很简单呢~


4. memcmp函数的使用


4.1函数介绍


4.2函数的使用

int main()
{
  int arr1[10] = { 1,2 };
  int arr2[10] = { 1,3 };
  printf("前4个字节比较%d\n", memcmp(arr1, arr2, 4));
  printf("前5个字节比较%d\n", memcmp(arr1, arr2, 5));
  printf("前8个字节比较%d\n", memcmp(arr1, arr2, 8));
  return 0;
}


我们来看一下运行效果~

相关文章
|
17天前
|
程序员 C语言
C语言库函数 — 内存函数(含模拟实现内存函数)
C语言库函数 — 内存函数(含模拟实现内存函数)
27 0
|
5天前
|
编译器 C语言
字符串与内存函数
字符串与内存函数
19 0
|
22小时前
|
C语言
【C语言】字符分类函数与字符转换函数
【C语言】字符分类函数与字符转换函数
7 1
|
23小时前
|
程序员 编译器 C语言
C语言之函数与参数
C语言之函数与参数
5 0
|
2天前
|
程序员 编译器 C语言
C语言知识:动态内存管理(malloc free calloc realloc)
C语言知识:动态内存管理(malloc free calloc realloc)
|
2天前
|
C语言
C语言:内存函数(memcpy memmove memset memcmp使用)
C语言:内存函数(memcpy memmove memset memcmp使用)
|
2天前
|
C语言
C语言:字符函数和字符串函数(strlen strcat strcmp strncmp等函数和模拟实现)
C语言:字符函数和字符串函数(strlen strcat strcmp strncmp等函数和模拟实现)
|
3天前
|
存储 C语言
C语言函数的返回值
C语言函数的返回值
7 0
|
4天前
|
C语言 Windows
C语言中的fopen与fclose函数详解
C语言中的fopen与fclose函数详解
11 1
|
4天前
|
C语言
深入理解C语言中的printf函数及数据输出
深入理解C语言中的printf函数及数据输出
13 0