C语言内存函数,让内存管理更高效!

1. memcpy使⽤和模拟实现

2. memmove使⽤和模拟实现

3. memset函数的使⽤

4. memcmp函数的使⽤




正文开始:

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 * memcpy ( void * dst, const void * src, size_t count)
{
 void * ret = dst;
 assert(dst);
 assert(src);
 /*
 * copy from lower addresses to higher addresses
 */
 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 ", arr2[i]);
 }
 return 0;
}
输出的结果:
memmove的模拟实现:
void * memmove ( void * dst, const void * src, size_t count)
{
 void * ret = dst;
 if (dst <= src || (char *)dst >= ((char *)src + count)) {
 /*
 * Non-Overlapping Buffers
 * copy from lower addresses to higher addresses
 */
 while (count--) {
 *(char *)dst = *(char *)src;
 dst = (char *)dst + 1;
 src = (char *)src + 1;
 }
 }
 else {
 /*
 * Overlapping Buffers
 * copy from higher addresses to lower addresses
 */
 dst = (char *)dst + count - 1;
 src = (char *)src + count - 1;
 while (count--) {
 *(char *)dst = *(char *)src;
 dst = (char *)dst - 1;
 src = (char *)src - 1;
 }
 }
 return(ret);
}
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;
}

 输出的结果:

xxxxxxworld

4. memcmp 函数的使⽤ 

int memcmp ( const void * ptr1, const void * ptr2, size_t num );

⽐较从ptr1和ptr2指针指向的位置开始,向后的num个字节

返回值如下:

#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);
 else printf("'%s' is the same as '%s'.\n", buffer1, buffer2);
 return 0;
}



完!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++】前缀和

目录 一维前缀和二维前缀和 一维前缀和 #include <iostream> using namespace std; #include <vector> int main() {int n,q;cin >> n >> q;vector<long long> arr(n1);for(int i 1;i<n;i){cin >> arr[i];}//创造前缀和数组vector<l…

安卓Activity上滑关闭效果实现

最近在做一个屏保功能&#xff0c;需要支持如图的上滑关闭功能。 因为屏保是可以左右滑动切换的&#xff0c;内部是一个viewpager 做这个效果的时候&#xff0c;关键就是要注意外层拦截触摸事件时&#xff0c;需要有条件的拦截&#xff0c;不能影响到内部viewpager的滑动处理…

linux设置Nacos自启动

前提&#xff1a;已经安装好nacos应用 可参考&#xff1a;Nacos单机版安装-CSDN博客 1. 创建nacos.service 1.1 在 /lib/systemd/system 目录底下&#xff0c;新建nacos.service文件 [Unit] Descriptionnacos Afternetwork.target[Service]Typeforking# 单机启动方式&#…

OpenLayers6实战,OpenLayers实现鼠标拖拽方式绘制梯形

专栏目录: OpenLayers实战进阶专栏目录 前言 本章讲解如何使用OpenLayers实现鼠标拖拽方式绘制梯形。点击鼠标拖拽梯形,松开鼠标后绘制完成。 二、依赖和使用 "ol": "^6.15.1"使用npm安装依赖npm install ol@6.15.1使用Yarn安装依赖yarn add olvue中…

磁盘提示格式化?别慌,这里有救星!

在使用电脑的过程中&#xff0c;突然遇到磁盘提示需要格式化的情况&#xff0c;确实让人感到焦虑不已。毕竟&#xff0c;这意味着存储在磁盘上的重要数据可能面临丢失的风险。然而&#xff0c;在恐慌之余&#xff0c;我们更应该冷静应对&#xff0c;寻找有效的数据恢复方案。本…

人工智能|深度学习——基于Xception实现戴口罩人脸表情识别

一、项目背景 近年来&#xff0c;随着人工智能技术的不断发展&#xff0c;人脸表情识别已经成为了计算机视觉领域中的重要研究方向之一。然而&#xff0c;在当前的疫情形势下&#xff0c;佩戴口罩已经成为了一项必要的防疫措施&#xff0c;但是佩戴口罩会遮挡住人脸的部分区域&…

如何备份 Outline 导出的 Markdown 文件

前面&#xff0c;我撰写了两篇文章&#xff0c;介绍了&#xff1a; 《如何在本地环境安装 Outline》《使用 Outline 搭建企业、个人知识库面临的问题》 今天&#xff0c;我们继续这个话题。使用 Outline 搭建知识库&#xff0c;如何备份自己知识库内的资料。 Outline 底层使用…

VTK| VTK可视化流程+圆锥示例

要想入门vtk&#xff0c;了解vtk的可视化流程是非常有必要的。 VTK可视化流程 VTK可视化流程主要分为数据处理和渲染两个过程&#xff0c;有一张不错的可视化流程图把这个过程理解为一个舞台剧。 VTKVS运行圆锥示例 先来运行一个简单的示例代码来理解VTK运作的过程&#xff…

薅熊链Berachain测试网空投

Berachain 是 Layer1 的一条公链。 Berachain 的经济模型引入了三种代币 BERA&#xff08;原生 Gas 代币&#xff09;&#xff1a;Bearchain 的Gas TokenBGT: Berachain 的治理 Token。 在权益证明&#xff08;Proof-of-Stake&#xff09;区块链中&#xff0c;治理通证通常用于…

一套C#自主版权+应用案例的手麻系统源码

手术麻醉信息管理系统源码&#xff0c;自主版权应用案例的手麻系统源码 手术麻醉信息管理系统包含了患者从预约申请手术到术前、术中、术后的流程控制。手术麻醉信息管理系统主要是由监护设备数据采集子系统和麻醉临床系统两个子部分组成。包括从手术申请到手术分配&#xff0c…

LeetCode-热题100:142. 环形链表 II

题目描述 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内…

CURL 实例用法参考

文章目录 1. 基础使用2. 指定请求Header3. 指定Http请求方法4. 发送POST请求,添加请求体5. 发送POST请求时&#xff0c;对请求体进行编码6. 设置请求来源7. 上传二进制文件8. 构造URL查询字段9. 新增请求头标头10. 参数打印服务器响应的标头11. 跳过SSL检测12. 模拟慢网络环境&…

GEE问题——在使用sentienl数据云掩膜的时候发现出现中间连贯性的“条带”问题,如何解决?

简介 在使用sentienl+landsat数据掩膜的时候发现出现了中间连贯性的条带问题,如何解决?这里我们使用GEE出品的Landsat和sentinel数据的过程中,当我们进行云掩膜的时候出现了条带的问题。 问题 您注意到这个问题了吗? 我该如何消除它们(例如,在镶嵌前遮蔽瓦片最外层的 …

【零基础学数据结构】顺序表

目录 1.了解数据结构 什么是数据结构&#xff1f; 为什么要进行数据管理&#xff1f; 2.顺序表 顺序表概要解析&#xff1a; ​编辑顺序表的分类&#xff1a; 差别和使用优先度&#xff1a; 1.创建顺序表 1.1顺序表分为静态顺序表和动态顺序表 1.2顺序表的初始化…

【考研数学】打基础,张宇《30讲》还是武忠祥《基础篇》?

如果基础不好&#xff0c;并且已经听过了汤家凤老师的零基础课程&#xff0c;我建议再去听一听张宇30讲 因为张宇30讲讲的要比汤家凤的零基础更加进阶&#xff0c;主要是引导学生思考&#xff0c;主要是讲题比较多。武忠祥老师的课程其实也不错&#xff0c;张宇和武忠祥的主要…

Java入门学习Day04

本篇文章主要介绍了&#xff1a;如何输入数据、字符串拼接、自增自减运算符、类型转换&#xff08;int&#xff0c;double等&#xff09; CSDN&#xff1a;码银 公众号&#xff1a;码银学编程 一、键盘输入练习 Scanner是Java中的一个类&#xff0c;用于从控制台或文件中读…

如何搭建自动化测试平台

“自动化测试”有何优势&#xff1f; 具有一致性和重复性的特点&#xff0c;而且测试更客观&#xff0c;提高了软件测试的准确度、精确度和可信任度。 可将任务自动化&#xff0c;能够解放人力去做更重要的工作。 自动化测试只需要部署好相应的场景&#xff0c;如高度复杂的使…

【CKA模拟题】StorageClass实战案例分析

Useful Resources: Storage Classes , Persistent Volumes Claim , Pods 题干 For this question, please set this context (In exam, diff cluster name) kubectl config use-context kubernetes-adminkubernetes Create a Storage Class named fast-storage with a provis…

用于无人机小型化设计的高精度温补晶振

用于无人机小型化设计的高精度温补晶振:TG2016SMN和TG2520SMN。无人机的发展可以说是非常的迅速&#xff0c;在安防&#xff0c;农业&#xff0c;交通&#xff0c;电力&#xff0c;直播等领域经常能看到无人机大显身手。无人机的应用场最是非常的广泛&#xff0c;功能更强&…

EVM Layer2 主流解决方案

深度解析主流 EVM Layer 2 解决方案&#xff1a;zk Rollups 和 Optimistic Rollups 随着以太坊网络的不断演进和 DeFi 生态系统的迅速增长&#xff0c;以太坊 Layer 2 解决方案日益受到关注。 其中&#xff0c;zk Rollups 和 Optimistic Rollups 作为两种备受瞩目的主流 EVM&…