内存操作函数的实现(C语言)

简介: 内存操作函数的实现(C语言)

一.Memcpy(内存复制函数)


1.库函数构造


1669214697876.jpg


库函数中由原内存内容(src)拷贝到目标内存内容(dest),因为原字符串是不做修改也防止修改的,所以加const修饰。又因为memcpy函数是任意类型的内存皆可以拷贝,所以是参数是void*,返回值是void*,而这一点是它相对于strcpy(字符串拷贝)的优势。还有一点,函数的头文件是#include<string.h>


2.函数基本使用


1669214717714.jpg


这个函数的使用还是比较简单的,就是简单的由子内容拷贝到目标内存空间,外加多少个字节拷贝。


3.函数实现


void* my_memcpy(void* dest, const void* src, size_t num)
{
  assert(dest && src);//断言,防止空指针
  void* start = dest;//存下起始地址
  while (num--)
  {
  *(char*)dest = *(char*)src;
  dest = (char*)dest + 1;
  src = (char*)src + 1;
  }
  return start;
}

这个函数中间有一些内容我想声明一下。为什么在构造的时候把它强制转换成char*,而不是int*等其他类型的呢?因为,memcpy可以拷贝任意类型的内存,所以如果转成int*,那么它每次只能拷贝4个字节,而对于字符串或是结构体的拷贝,它们的大小可能不是4的整数倍,这样就会导致拷贝的失败,所以为了可以拷贝全部内存,要一个一个字节的拷贝,而char*恰好满足这样的条件.


二.Memmove(字符串移动)


1.库函数的构造


1669214750427.jpg


这个函数构造基本和memcpy相同,它的作用是从子内存移动count个字节到目标内存空间。这个功能好像和memcpy很相似,但是它是要优于memcpy的,因为memcpy是无法实现自己拷贝自己的,而这一函数是可以实现的。


2.函数基本使用


这个函数基本使用是和memcpy很相似的,只不过它多了可以自己拷贝自己这个功能。


我们可以看一下

1669214764103.jpg

1669214772671.jpg

使用memcpy会导致拷贝失败,而使用memmove是可以的

1669214782075.jpg


3.函数实现


1669214792712.jpg


这个函数和memcpy大同小异,只不过它是加了一步判断.


我们通过实践就会发现:


如果src(要拷贝的内容)在dest(目标空间)的左边,也就是地址小于dest,那么就要从右往左拷贝,如果src地址高于dest,那么就要从左往右拷贝。基于这一理念,我们就可以轻松地设计出库函数。


void* my_memmove(void* dest, const void* src, size_t num)
{
  assert(dest && src);
  void* start = dest;
  //如果dest在src左边
  if (dest < src)
  {
  while (num--)
  {
    *(char*)dest = *(char*)src;
    dest = (char*)dest + 1;
    src = (char*)src + 1;
  }
  }
  else
  {
  //从右往左
  size_t ret = num;
  while (num--)
  {
    *((char*)dest+num) = *((char*)src+num);
  }
  }
  return start;
}


三.Memset(内存设置函数)


1.库函数构造


1669214823367.jpg


count个c初始化目标空间(dest).需要注意的是这里的c不是只有整型,是包括char类型的,毕竟char也是整型家族的,是ASCII码值。


2.函数使用


1669214836740.jpg


这个函数比较简单,就是初始化指定空间。


3.函数实现


void* my_memset(void* dest, int c, size_t num)
{
  assert(dest);
  void* start = dest;
  while (num--)
  {
  *(char*)dest = c;
  ((char*)dest)++;
  }
  return start;
}

1669214864549.jpg


四.Memcmp


1.库函数构造


1669214874160.jpg

两个内存比较count个字节,*buf1>*buf2则返回大于0的数,小于则返回小于0的数,等于则返回0.


2.函数基本使用


1669214888059.jpg


3.函数构造

int my_memcmp(const void* buf1, const void* buf2, size_t num)
{
  assert(buf1 && buf2);//断言
  while (num--)
  {
  if (*(char*)buf1 == *(char*)buf2)
  {
    ((char*)buf1)++;
    ((char*)buf2)++;
  }
  else
    return *(char*)buf1 - *(char*)buf2;
  }
  return 0;
}

1669214898524.jpg

相关文章
|
3天前
|
算法 C语言
【C语言程序设计——函数】利用函数求解最大公约数和最小公倍数(头歌实践教学平台习题)【合集】
本文档介绍了如何编写两个子函数,分别求任意两个整数的最大公约数和最小公倍数。内容涵盖循环控制与跳转语句的使用、最大公约数的求法(包括辗转相除法和更相减损术),以及基于最大公约数求最小公倍数的方法。通过示例代码和测试说明,帮助读者理解和实现相关算法。最终提供了完整的通关代码及测试结果,确保编程任务的成功完成。
26 15
|
3天前
|
C语言
【C语言程序设计——函数】亲密数判定(头歌实践教学平台习题)【合集】
本文介绍了通过编程实现打印3000以内的全部亲密数的任务。主要内容包括: 1. **任务描述**:实现函数打印3000以内的全部亲密数。 2. **相关知识**: - 循环控制和跳转语句(for、while循环,break、continue语句)的使用。 - 亲密数的概念及历史背景。 - 判断亲密数的方法:计算数A的因子和存于B,再计算B的因子和存于sum,最后比较sum与A是否相等。 3. **编程要求**:根据提示在指定区域内补充代码。 4. **测试说明**:平台对代码进行测试,预期输出如220和284是一组亲密数。 5. **通关代码**:提供了完整的C语言代码实现
39 24
|
3天前
|
存储 算法 C语言
【C语言程序设计——函数】素数判定(头歌实践教学平台习题)【合集】
本内容介绍了编写一个判断素数的子函数的任务,涵盖循环控制与跳转语句、算术运算符(%)、以及素数的概念。任务要求在主函数中输入整数并输出是否为素数的信息。相关知识包括 `for` 和 `while` 循环、`break` 和 `continue` 语句、取余运算符 `%` 的使用及素数定义、分布规律和应用场景。编程要求根据提示补充代码,测试说明提供了输入输出示例,最后给出通关代码和测试结果。 任务核心:编写判断素数的子函数并在主函数中调用,涉及循环结构和条件判断。
39 23
|
2天前
|
存储 编译器 C语言
【C语言程序设计——函数】回文数判定(头歌实践教学平台习题)【合集】
算术运算于 C 语言仿若精密 “齿轮组”,驱动着数值处理流程。编写函数求区间[100,500]中所有的回文数,要求每行打印10个数。根据提示在右侧编辑器Begin--End之间的区域内补充必要的代码。如果操作数是浮点数,在 C 语言中是不允许直接进行。的结果是 -1,因为 -7 除以 3 商为 -2,余数为 -1;注意:每一个数据输出格式为 printf("%4d", i);的结果是 1,因为 7 除以 -3 商为 -2,余数为 1。取余运算要求两个操作数必须是整数类型,包括。开始你的任务吧,祝你成功!
17 1
|
1月前
|
存储 编译器 程序员
【C语言】内存布局大揭秘 ! -《堆、栈和你从未听说过的内存角落》
在C语言中,内存布局是程序运行时非常重要的概念。内存布局直接影响程序的性能、稳定性和安全性。理解C程序的内存布局,有助于编写更高效和可靠的代码。本文将详细介绍C程序的内存布局,包括代码段、数据段、堆、栈等部分,并提供相关的示例和应用。
52 5
【C语言】内存布局大揭秘 ! -《堆、栈和你从未听说过的内存角落》
|
1月前
|
存储 C语言 开发者
【C语言】字符串操作函数详解
这些字符串操作函数在C语言中提供了强大的功能,帮助开发者有效地处理字符串数据。通过对每个函数的详细讲解、示例代码和表格说明,可以更好地理解如何使用这些函数进行各种字符串操作。如果在实际编程中遇到特定的字符串处理需求,可以参考这些函数和示例,灵活运用。
75 10
|
1月前
|
存储 程序员 C语言
【C语言】文件操作函数详解
C语言提供了一组标准库函数来处理文件操作,这些函数定义在 `<stdio.h>` 头文件中。文件操作包括文件的打开、读写、关闭以及文件属性的查询等。以下是常用文件操作函数的详细讲解,包括函数原型、参数说明、返回值说明、示例代码和表格汇总。
59 9
|
1月前
|
存储 Unix Serverless
【C语言】常用函数汇总表
本文总结了C语言中常用的函数,涵盖输入/输出、字符串操作、内存管理、数学运算、时间处理、文件操作及布尔类型等多个方面。每类函数均以表格形式列出其功能和使用示例,便于快速查阅和学习。通过综合示例代码,展示了这些函数的实际应用,帮助读者更好地理解和掌握C语言的基本功能和标准库函数的使用方法。感谢阅读,希望对你有所帮助!
45 8
|
1月前
|
C语言 开发者
【C语言】数学函数详解
在C语言中,数学函数是由标准库 `math.h` 提供的。使用这些函数时,需要包含 `#include <math.h>` 头文件。以下是一些常用的数学函数的详细讲解,包括函数原型、参数说明、返回值说明以及示例代码和表格汇总。
55 6
|
1月前
|
存储 C语言
【C语言】输入/输出函数详解
在C语言中,输入/输出操作是通过标准库函数来实现的。这些函数分为两类:标准输入输出函数和文件输入输出函数。
321 6