当前位置: 首页 > news >正文

【C语言进阶】内存函数

目录

1.memcpy函数

1.1 模拟实现

2.memmove函数

3.memcmp函数


1.memcpy函数

字符串拷贝strcpy和strncpy是有一定局限性的,只能拷贝字符串,而memcpy可以拷贝任意类型的数据,单位是字节。

1.1 模拟实现

#include<stdio.h>
#include<assert.h>
// 返回目标空间的的首地址
void* my_memcpy(void* des,void* src,size_t num) 
{assert(des && src);void* ret = des;while (num--){*((char*)des) = *((char*)src);((char*)des)++;((char*)src)++;}return ret;
}int main() 
{int arr1[] = { 1, 2, 3, 4, 5, 6, 7 };int arr2[20] = { 0 };my_memcpy(arr2, arr1, sizeof(arr1));return 0;
}

 

2.memmove函数

        我们发现:自己实现的memcpy不能实现自己拷贝自己,这是因为在逐字节拷贝的时候,后面的元素再去拷贝前面的字节,前面的字节已经被改过了;但是库函数是可以自己拷贝自己的。

        memmove能够实现自己拷贝自己

2.1 模拟实现

情况1:dest < src,此时应该从前向后拷贝,这样就会避免,拷贝修改之后的值。

情况2:当des > src,此时从后往前拷贝。

 

总体区域划分:

 

方案①:1、3区域从前往后拷贝;2区域从后往前拷贝; 

方案②:1区域从前向后(dest > src);23区域从后往前拷贝(dest < src);

这里采用方案②,只需要判断dest 和 src的大小即可。

#include<stdio.h>
#include<string.h>
#include<assert.h>
void* my_memmove(void* dest, void* src, size_t num)
{assert(dest && src);void* ret = dest;if (dest <  src){while (num--){// 从前向后拷贝*((char*)dest) = *((char*)src);((char*)dest)++;((char*)src)++;}}else{while (num--){// 从后向前拷贝,最后一个->倒数第二个*((char*)dest + num) = *((char*)src + num);}}return ret;
}int main()
{int arr1[] = { 1, 2, 3, 4, 5, 6, 7 ,8,9,10 };int arr2[20] = { 0 };//my_memcpy(arr2, arr1, sizeof(arr1));my_memmove(arr1, arr1 + 3, 12);int i = 0;for(i = 0;i < 10;i++){printf("%d\n", arr1[i]);}return 0;
}

3.memcmp函数

 

第一个数组的内存中的数据比第二个内存中的数据要大。 

4.memset函数

使用来初始化内存的,第一个参数是起始地址,第二个参数是初始化的值,第三个是初始化的字节个数。

需要注意的是,这里的初始化是按照字节初始化的,所以尽量给一个字节类型的数据。

http://www.dtcms.com/a/285180.html

相关文章:

  • app打包ios上架appStore流程
  • 强化第三讲—一元函数微分学的概念
  • vue + Cesium 实现 3D 地图水面效果详解
  • Leetcode刷题营第二十七题:二叉树的最大深度
  • 研二Last Day
  • 【保姆级喂饭教程】idea开发TODO规范
  • 【项目实践08】【事务加锁的问题】
  • 【C++类和对象解密】面向对象编程的核心概念(下)
  • openinstall上线SSL证书服务,开启数字安全新纪元
  • 从现场出发:能源系统中的智能设备与实际落地工具解读
  • 7 基本的空间关系判断
  • Git仓库核心概念与工作流程详解:从入门到精通
  • 「Java案例」递归实现整数的倒置
  • MyBatis-Flex 学习与整理
  • LeNet-5 详解:从理论到实践
  • HTML前端性能优化完整指南
  • LeetCode 234:回文链表
  • 文件类型说明
  • H7-TOOL脱机下载后,自动重连RTT,CAN和串口助手三合一模式方法,方便项目测试(2025-07-16)
  • Spring Boot 分层架构详解:Controller、Service、Mapper...
  • C++网络编程 5.TCP套接字(socket)通信进阶-基于多线程的TCP多客户端通信
  • 鸿蒙状态栏操作
  • 能碳管理平台:企业碳减排解决方案绿色工厂达标工具
  • Trae IDE:打造完美Java开发环境的实战指南
  • 基于深度学习的电信号分类识别与混淆矩阵分析
  • AI 总结工作报告
  • 【人工智能agent】--dify版本更新(通用)
  • 错误经验一:计算两个整数a和b的和
  • Paimon 动态分桶
  • 如何优雅处理 Flowable 工作流的 TaskAlreadyClaimedException?