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;
}


我们来看一下运行效果~

相关文章
|
4天前
|
存储 程序员 编译器
C语言:动态内存管理
C语言:动态内存管理
9 1
|
4天前
|
存储 编译器 程序员
C语言:数据在内存中的存储
C语言:数据在内存中的存储
10 2
|
4天前
|
存储 编译器 C语言
C语言:字符函数 & 字符串函数 & 内存函数
C语言:字符函数 & 字符串函数 & 内存函数
11 2
|
7天前
|
编译器
练习使用动态内存相关的4个函数:malloc、calloc、realloc、free
在了解使用动态内存相关的四个函数之前,我们先了解一下,为什么要有动态内存分配?
15 0
|
7天前
|
存储 编译器 C++
【C++】内存管理和模板基础(new、delete、类及函数模板)
【C++】内存管理和模板基础(new、delete、类及函数模板)
21 1
|
7天前
|
编译器 C语言 C++
详解内存操作函数
详解内存操作函数
|
12天前
|
缓存 安全 编译器
【C 言专栏】C 语言函数的高效编程技巧
【5月更文挑战第1天】本文探讨了C语言中函数的高效编程技巧,包括函数的定义与作用(如代码复用和提高可读性)、设计原则(单一职责和接口简洁)、参数传递方式(值传递、指针传递和引用传递)、返回值管理、调用约定、嵌套与递归调用,以及函数优化技巧和常见错误避免。掌握这些技巧能提升C语言代码的质量和效率。
【C 言专栏】C 语言函数的高效编程技巧
|
12天前
|
存储 C语言 开发者
【C言专栏】C 语言实现动态内存分配
【4月更文挑战第30天】C语言中的动态内存分配允许程序运行时按需分配内存,提供处理未知数据量的灵活性。这涉及`malloc()`, `calloc()`, `realloc()`, 和 `free()`四个标准库函数。`malloc()`分配指定大小的内存,`calloc()`同时初始化为零,`realloc()`调整内存大小,而`free()`释放内存。开发者需谨慎处理内存泄漏和指针使用,确保程序的稳定性和性能。动态内存分配是C语言中的重要技能,但也需要良好的内存管理实践。
|
13天前
|
存储 程序员 C语言
C语言进阶第九课 --------动态内存管理-2
C语言进阶第九课 --------动态内存管理
|
13天前
|
编译器 C语言
C语言进阶第九课 --------动态内存管理-1
C语言进阶第九课 --------动态内存管理