C语言从入门到实战----C语言中内存函数的使用和模拟实现

目录

前言

1.memcpy 使用和模拟实现 

2. memmove 使用和模拟实现

3. memset 函数的使用

4. memcmp 函数的使用


前言

在编程领域,内存管理是至关重要的一环,它确保了程序能够高效、稳定地运行。

C语言作为一门底层的编程语言,提供了一系列的内存管理函数供开发者使用,以实现动态内存的分配、释放和访问。

包括了一系列用于操作内存内容的函数:

1.内存复制函数: 

  • memcpy(): 将源内存区域的内容复制到目标内存区域,不保证源和目标区域有重叠;
  • memmove(): 类似于memcpy(),但在源和目标区域有重叠时也能正确工作。

2. 内存设置函数:

  • memset(): 将指定的内存区域设置为某个特定的值,常用于初始化内存

 3.内存比较函数:

  • memcmp(): 比较两个内存区域的前n个字节,返回第一个不相同字节的差值。

1.memcpy 使用和模拟实现 

 

void * memcpy ( void * destination, const void * source, size_t num );
  •  函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置;
  • 这个函数在遇到 '\0' 的时候并不会停下来;
  • 如果source和destination有任何的重叠,复制的结果都是未定义的。
#include <stdio.h>
#include <string.h>
int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };int arr2[10] = { 0 };memcpy(arr2, arr1, 20);int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr2[i]);}return 0;
}

 

对于重叠的内存,交给memmove来处理。 

memcpy函数的模拟实现:

 

void * my_memcpy ( void * dst, const void * src, size_t count)
{void * ret = dst;assert(dst);assert(src);while (count--) {*(char *)dst = *(char *)src;dst = (char *)dst + 1;src = (char *)src + 1;}return(ret);
}

2. memmove 使用和模拟实现

void * memmove ( void * destination, const void * source, size_t num );
  •  和memcpy的差别就是memmove函数处理的源内存块和⽬标内存块是可以重叠的。
  • 如果源空间和⽬标空间出现重叠,就得使⽤memmove函数处理。

 

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

 

memmove的模拟实现:

void* my_memmove(void* dest, void* src, size_t num)
{void* ret = dest;if (src < dest){while (num--){*((char*)dest+num) = *((char*)src+num);}}else{while (num--){*(char*)dest = *(char*)src;((char*)dest)++;((char*)src)++;}}return ret;
}
int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,10 };my_memmove(arr + 2, arr, 20);for (int i = 0; i < 10; i++){printf("%d ", arr[i]);}return 0;
}

3. memset 函数的使用

void * memset ( void * ptr, int value, size_t num );

 memset是⽤来设置内存的,将内存中的值以字节为单位设置成想要的内容。

 

#include <stdio.h>
#include <string.h>
int main()
{char str[] = "hello world";memset(str, 'x', 6);printf(str);return 0;
}

 

4. memcmp 函数的使用

int memcmp ( const void * ptr1, const void * ptr2, size_t num );
  •   ⽐较从ptr1和ptr2指针指向的位置开始,向后的num个字节er
  •   返回值如下:

 

#include <stdio.h>
#include <string.h>
int main()
{char buffer1[] = "DWgaOtP12df0";char buffer2[] = "DWGAOTP12DF0";int n;n = memcmp(buffer1, buffer2, sizeof(buffer1));if (n > 0)printf("'%s' is greater than '%s'.\n", buffer1, buffer2);else if (n < 0)printf("'%s' is less than '%s'.\n", buffer1, buffer2);elseprintf("'%s' is the same as '%s'.\n", buffer1, buffer2);return 0;
}

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/768972.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis 教程系列之Redis 集群配置(十三)

1.Redis集群方案比较 主从模式 在软件的架构中,主从模式(Master-Slave)是使用较多的一种架构。主(Master)和从(Slave)分别部署在不同的服务器上,当主节点服务器写入数据时,同时也会将数据同步至从节点服务器,通常情况下,主节点负责写入数据,而从节点负责读取数据。…

Apollo9.0使用过程中遇到的错误及解决办法

1、编译过程中提示Socket closed导致编译未完成 Server terminated abruptly (error code: 14, error message: Socket closed, log file: /apollo/.cache/bazel/540135163923dd7d5820f3ee4b306b32/server/jvm.out)硬件资源耗尽导致OOM&#xff0c;可以自行修改脚本来控制编译…

橘子疾病检测4种YOLOV8

橘子检测YOLOV8&#xff0c;检测4种疾病&#xff0c;采用YOLOV8-NANO&#xff0c;训练得到PT模型转换成ONNX&#xff0c;最后OPENCV调用&#xff0c;支持C/PYTHON/ANDROID 橘子检测YOLOV8&#xff0c;检测4种疾病

2025汤家凤考研数学视频,基础网课百度网盘课程+PDF讲义资料

2025汤家凤大神及数学全程 docs.qq.com/doc/DTmtOa0Fzc0V3WElI 复制粘贴到浏览器&#xff0c;可以见所有的Ke 第一轮 夯实基础 1.阅读大纲考查要求&#xff0c;明确每章的学习目标&#xff1b; 2.按节学习数学理论基础知识&#xff0c;吃透书中例题&#xff1b; 3.学习每章…

Analysis of Negative Sampling Methods for Knowledge Graph Embedding

摘要 负采样是一种用于加速知识图嵌入学习和最大化嵌入模型在链接预测和实体解析等支持任务中的有效性的方法。负采样对于提高准确性、减少偏差、提高效率和改善代表性至关重要。本文仔细研究了在基准数据集Fb15k上&#xff0c;张量分解和平移嵌入模型的两种基本负采样技术增加…

【C语言】数组(一维、二维数组的简单介绍)

数组&#xff08;Array&#xff09; 数组概念 数组是一组相同数据类型元素的集合&#xff0c;属于一种简单的数据结构&#xff0c;从中可以得到三个有效信息 数组元素是同一数据类型的变量数组存放一个或者多个数据&#xff0c;但是数组元素个数不能为0数组中各元素可独立作为…

unity 动态获取Animator 状态机中某个动画片段的播放速度(获取到速度来计算 播放时长)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言获取某个动画片段的播放速度&#xff0c;并且得到播放时长1.获取速度2.计算时长 总结 前言 这个功能主要是因为 每个动画片段的播放速度不一样&#xff0c;需要…

【Web APIs】DOM节点

目录 1.节点操作 1.1DOM节点 1.2查找节点 1.2.1父节点查找 1.2.2子节点查找 1.2.3兄弟节点查找 1.3增加节点 1.4克隆节点 1.5删除节点 2.时间对象 2.1实例化 2.2时间对象方法 2.3时间戳 3.重绘和回流 1.节点操作 1.1DOM节点 DOM节点&#xff1a;DOM树中的每一个…

CHAT~(持续更新)

CHAT&#xff08;持续更新&#xff09; 实现一个ChatGPT创建API设计页面布局业务操作技术架构 编码其他 实现一个ChatGPT 创建API 最简单也最需要信息的一步 继续往下做的前提 此处省略&#xff0c;想要获取接口创建方式联系 设计 页面布局 按照官网布局 业务操作 注册登…

绝地求生:PUBG七周年庆典开启!参与周年话题投稿赢丰厚奖励

为庆祝七周年&#xff0c;闲游盒PUBG官方准备了众多活动与奖励&#xff0c;一起在庆典中创造难忘的回忆吧&#xff01;七周年庆典期间游玩PUBG&#xff0c;参与 #乐在7中鸡味无穷# 周年话题投稿&#xff0c;即有机会赢取魔力甜心萨莉套装 2奖励。 参与方式 在小黑盒PUBG社区中…

贪心算法相关题目

文章目录 1. 什么是贪心&#xff1f;2. 分发饼干3. 摆动序列4. 最大子数组和5. 买卖股票的最佳时机 II6. 跳跃游戏7. 跳跃游戏 II8.K 次取反后最大化的数组和9.加油站10.分发糖果11.柠檬水找零 1. 什么是贪心&#xff1f; 贪心的本质是选择每一阶段的局部最优&#xff0c;从而…

Python数据分析一

一、Python之输出函数和输入函数 Python中的输出函数和输入函数分别是print()和input()。 输出函数 print() print()函数用于将数据打印到标准输出&#xff08;通常是控制台&#xff09;&#xff0c;以便用户查看。它可以接受一个或多个参数&#xff0c;并在打印时使用空格分隔…

第1篇:Mysql数据库表结构导出字段到Excel(一个sheet中)

package com.xx.util;import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.sql.*; import java.io.*;public class DatabaseToExcel {public static void main(String[] args) throws Exception {// 数据库连接配置String u…

Less-1(sqlmap手工注入攻击)--sqli

第一步&#xff1a;判断他是什么sql注入&#xff1f; 1 报错 1 and 12 -- 错误结果(--表示注释符) 1 and 11 -- 正确结果 第二步&#xff1a;判断返回字段数 ?id1 order by 3-- 正确显示结果 ?id1 order by 4--当列数为4时开始报错&#xff0c;所以只有三列 注&#xf…

机器学习核心原理

机器学习的核心原理是利用数据和数学模型来训练计算机系统&#xff0c;使其能够从数据中学习并进行预测、分类、识别、聚类等任务。以下是机器学习的核心原理&#xff1a; 1. **数据表示**&#xff1a;机器学习的基础是数据&#xff0c;而数据的表示对于机器学习任务至关重要。…

github的2FA问题

文章目录 问题描述方式一&#xff1a;chrome浏览器插件 问题描述 方式一&#xff1a;chrome浏览器插件 1、 第一步 安装插件&#xff1a;Authenticator 2、 第二步 打开github验证界面&#xff0c;并点击该插件

15 网络管理与网络安全(3)

1.入侵检测系统的基本功能 ① 监控、分析用户和系统的行为&#xff1b;② 检查系统的配置和漏洞&#xff1b;③ 评估重要的系统和数据文件的完整性&#xff1b;④ 对异常行为的统计分析&#xff0c;识别攻击类型&#xff0c;并向网络管理入员报警&#xff1b;⑤ 对操作系统进行…

关于分布式系统设计的个人看法和经验

1.接口要保证幂等 2.客户端要设置超时时间和兜底措施 3.服务端调用三方要设置超时和重试机制以及兜底 4.服务端要有熔断和降级以及限流机制 5.避免使用大事务 6.对热点数据使用缓存(浏览器缓存/客户端缓存/分布式缓存/应用级缓存) 7.对大表数据考虑分库分表 8.对于需要进行多表…

蓝桥杯-模拟-航班时间

题目 思路 去时到达外地的时间-去时离开本地的时间 时区差时飞行时间 回时到达本地的时间-回时离开外地的时间 -时区差时飞行时间 故二者加起来即可得到飞行时间 代码 # 去时到达外地的时间-去时离开本地的时间 时区差时飞行时间 # 回时到达本地的时间-回时离开外地的时间 -…

突破编程_C++_C++11新特性(lambda表达式的实战应用)

1 Lambda 表达式的调用与操作 1.1 Lambda 表达式作为函数参数传递 Lambda 表达式可以像普通函数或函数对象一样被传递作为函数的参数。这种灵活性使得 Lambda 表达式在 C 的算法库和函数式编程风格中特别有用。当需要将一个小的、匿名的函数作为参数传递给另一个函数时&#…