C语言----C语言内存函数

1.memcpy--内存拷贝--使用和模拟实现 

//memcpy基本格式:
//               目标空间地址       原空间地址        被拷贝的字节个数
//void *memcpy(void * destination, const void * source,size_t num);
//因为内存拷贝拷贝的数据有:整型数据、结构体数据、结构体数据。那么我们就要用到void*进行接收任意类型的数据
//void*指针可以接收任意空间//size_t num这个是要被拷贝的字节个数
////返回的是目标空间的起始地址int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };int arr2[20] = { 0 };memcpy(arr2, arr1 + 2, 20);//因为我们要拷贝的是3~7,那么就是5个整型,20个字节//因为我们要从3开始进行拷贝//恰好因为数组名是首元素的地址,那么3的地址就是arr+2//将arr1中的3 4 5 6 7拷贝放到arr2中for (int i = 0; i < 20; i++){printf("%d ", arr2[i]);}return 0;
}
//我们要满足目标空间能进行修改
//目标空间足够大//这个memcpy函数是不会考虑\0的,我让他拷贝多少个字节他就拷贝多少个字节

函数memcpy从source的位置开始复制num个字节的数据到destination指向的内存位置。

1.这个函数在遇到\0的时候并不会停下来

2.如果source和destination有任何的重叠,复制的结果都是未定义的

memcpy函数最终返回的是目标空间的起始地址

//函数的一种写法:
这个函数最终返回的是目标空间的起始地址
//void* my_memcpy(void *dest, const void*src, size_t num)//目标空间是要进行修改的,但是源头是不能被修改的,所以我们加上const
//{
//    assert(src && dest);//防止两个指针是空指针
//    void* ret = dest;//我们需要先创建一个指针存放最开始的dest,通过ret我们可以找到dest指向的数组
//    //这里的src指向的是数组中3的位置
//    //dest指向的是arr2数组的首元素的位置
//    //拷贝20个字节
//    //void*的指针不能进行直接计算,void*的指针是无具体类型的指针
//    for (int i = 0; i < num; i++)//一对字节一对字节
//    {
//        *(char*)dest = *(char*)src;//强制类型转换再进行解引用就将那一对字节进行交换
//        dest = (char*)dest + 1;//先将dest强制类型转换,在进行+1操作,因为上面的强制类型转换只是暂时的,为了能让dest进行++操作,我们就这样操作
//        src = (char*)src + 1;
//    }
//    return ret;
//}//函数的另一种写法:
//函数的一种写法:
//这个函数最终返回的是目标空间的起始地址
void* my_memcpy(void *dest, const void*src, size_t num)
{assert(src && dest);void* ret = dest;while (num--)//也是循环num次{*(char*)dest = *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;}return ret;
}int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };int arr2[20] = { 0 };int *p=my_memcpy(arr2, arr1 + 2, 20);//这个函数的作用就是我们在arr1中选择的那部分粘贴在arr2中for (int i = 0; i < 20; i++){printf("%d ", p[i]);}return 0;
}//memcpy函数不负责重叠内存的拷贝,非要使用,结果就是未定义的//只负责不重叠的内存

函数的返回值是void*类型的数据

这个memcpy函数有三个数据

2.memmove--内存移动--使用和模拟实现 

2.memmove--内存移动--使用和模拟实现

int main()
{//将123456拷贝放到34567上面int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };memmove(arr1 + 2, arr1, 20);for (int i = 0; i < 10; i++){printf("%d ", arr1[i]);}//输出结果是1 2 1 2 3 4 5 8 9 10return 0;
}
//memmove就是用来处理这些重叠内存的拷贝
void* my_memmove(void *dest, const void*src, size_t num)
{void* ret = dest;//将目标空间起始地址记录下来assert(dest && src);//保证指针的有效性//最开始的dest指向的是3,src指向的是1,字节是20if (dest < src)//前-->后//目标空间的首元素<拷贝的起始元素--就相当与我们把34567拷贝到12345//那么12的位置就是dest<src的位置{while (num--)//总共拷贝num个字节,那么就是num--,等所有字节拷贝完循环就停止了{*(char*)dest = *(char*)src;//拷贝完一对字节就往后走,进行+1操作dest = (char*)dest + 1;src = (char*)src + 1;}}else//后-->前剩下的区域---dest > src{while (num--){//进入循环的时候,num 已经是19了//*((char*)dest + num)---找到最后一个字节的位置*((char*)dest + num)    =       *((char*)src + num);//目标的最后一个位置的字节------    起源空间的最后一个位置//将起源的最后一个字节先开始挪动,从最后一个位置依次挪动//就是将我们要挪动的那块区域,我们从最右边开始挪动}}return ret;
}
int main()
{//将123456拷贝放到34567上面int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };my_memmove(arr1 + 2, arr1, 20);for (int i = 0; i < 10; i++){printf("%d ", arr1[i]);//1 2 1 2 3 4 5 8 9 10}return 0;
}//总之:这个拷贝是分三块区域的,最前面的一块区域满足dest<src
//我们只能从前往后进行拷贝,不然会出错误//而剩下的两块区域可以同时从后往前进行拷贝,那么我们就将这两块区域放在一起

在C语言标准中,明确规定了memcpy只要能实现不重叠的拷贝就行,重叠的拷贝交给memmove

我们发现vs上面的库函数memcpy函数也能实现重叠内存的拷贝

我们在以后的拷贝中,我们可以用memmove,因为不管是重叠的还是不重叠的都能搞定

3.memset--内存设置--函数的使用 

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

基本格式:

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

ptr就是指向要被填充的内存块的指针

value就是我们想要设置的值是什么

num是设置的字节的大小

int main()
{char arr[] = "hello world";//将world改成5个xmemset(arr + 6, 'x', 5);//数组首元素的地址+6就是指向的是wprintf("%s\n", arr);return 0;
}

4.memcmp--内存比较--函数的使用 

4.memcmp--内存比较--函数的使用

内存的比较

什么类型的都能进行比较

int main()
{int arr1[] = { 1,2,3,4,5 };int arr2[] = { 1,2,3,6,5 };int ret=memcmp(arr1, arr2, 16);printf("%d\n", ret);//输出的数据就是-1//就是说明arr1<arr2return 0;
}

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

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

相关文章

使用CSS常见问题解答卡片

常见问题解答卡片 效果展示 CSS 知识点 CSS 选择器的使用background 渐变背景色运用CSS 综合知识运用 页面整体布局 <div class"container"><h1>经常问的问题</h1><!-- 这里只是展示一个项目 --><div class"tab"><in…

深入Node.js:实现网易云音乐数据自动化抓取

随着互联网技术的飞速发展&#xff0c;数据已成为企业和个人获取信息、洞察市场趋势的重要资源。音频数据&#xff0c;尤其是来自流行音乐平台如网易云音乐的数据&#xff0c;因其丰富的用户交互和内容多样性&#xff0c;成为研究用户行为和市场动态的宝贵资料。本文将深入探讨…

MyBatis 关于查询语句上配置的详细内容

1. MyBatis 关于查询语句上配置的详细内容 文章目录 1. MyBatis 关于查询语句上配置的详细内容2. 准备工作3. SQL查询结果&#xff0c;返回为POJO实体类型4. SQL查询结果&#xff0c;返回为List<POJO\> 集合类型5. SQL查询结果&#xff0c;返回为Map 集合6. SQL查询结果&…

Django期末重点

思维导图 一、Djanog框架基础 MVT设计模式&#xff08;model模型【操作数据库】、template模板【页面展示】、view视图【处理请求和调用模型模板】&#xff09; 二、Django项目框架搭建 创建项目骨架 django-admin startproject 项目名启动服务 &#xff08;1&#xff09;p…

冒泡排序、选择排序

冒泡排序 按照冒泡排序的思想&#xff0c;我们要把相邻的元素两两比较&#xff0c;当一个元素大于右侧相元素时&#xff0c;交换它们的位置&#xff1b;当一个元素小于或等于右侧相邻元素时&#xff0c;位置不变 大的往右丢&#xff08;往下沉&#xff09;&#xff0c;小的往…

ArcGIS arcpy代码工具——批量要素裁剪栅格影像

系列文章目录 ArcGIS arcpy代码工具——批量对MXD文件的页面布局设置修改 ArcGIS arcpy代码工具——数据驱动工具批量导出MXD文档并同步导出图片 ArcGIS arcpy代码工具——将要素属性表字段及要素截图插入word模板 ArcGIS arcpy代码工具——定制属性表字段输出表格 ArcGIS arc…

大促活动后为什么要做数据分析?详解促销复盘分析指标?

在电商平台促销活动已成为商家吸引顾客、提升销售的重要手段。无论是一年一度的”双十一”、”618″&#xff0c;还是针对特定节日的小规模促销&#xff0c;这些活动都能在短时间内引爆消费者的购买热情&#xff0c;显著提升店铺的销售业绩。然而&#xff0c;促销活动的成功与否…

9.2.2 DeepLab系列模型中每一代的创新是什么?是为了解决什么问题?

9.2.2 DeepLab系列模型中每一代的创新是什么&#xff1f;是为了解决什么问题&#xff1f; 前情回顾&#xff1a;9.2.1 简述图像分割中经常用到的编码器-解码器网络结构的设计理念。 DeepLab是Google 团队提出的一系列图像分割算法。 DeepLab v1在2014年被提出&#xff0c;并在…

最值得入手的宠物空气净化器!希喂、352、安德迈真实测评~

随着天气越来越热&#xff0c;猫咪们也都开始掉毛啦。这时候&#xff0c;家里面到处都飘浮着猫咪们的浮毛和粑粑异味。抵抗力较差的铲屎官&#xff0c;身体就会出现一些问题&#xff0c;例如打喷嚏、咳嗽等呼吸道问题。 很多铲屎官以为用粘毛器、吸尘器等工具就能将猫咪们掉落…

中国房地产统计年鉴(1999-2023年)

数据年限&#xff1a;1999-2023 数据格式&#xff1a;pdf、excel 数据内容&#xff1a;《中国房地产统计年鉴》是一部反映中国房地产市场运行状况的统计资料&#xff0c;收集了全国房地产开发企业开发经营统计数据&#xff0c;是全面客观研究和深入量化分析房地产市场的权威工具…

赶走异味保持清香,何浩明净味爽身香体膏

夏天来了&#xff0c;大家都想要清清爽爽的出门&#xff0c;但是汗味、狐臭这些小问题都在所难免&#xff0c;总要想办法应对&#xff0c;我目前用的是一款香体膏&#xff0c;它不仅能赶走那些让人尴尬的异味&#xff0c;还能让我们享受一整天的清新自在。 我用的这款叫做何浩明…

计算机跨考现状,两极分化现象很严重

其实我觉得跨考计算机对于一些本科学过高数的同学来说有天然的优势 只要高数能学会&#xff0c;那计算机那几本专业课&#xff0c;也能很轻松的拿下&#xff0c;而对于本科是文科类的专业&#xff0c;如果想跨考计算机&#xff0c;难度就不是一般的大了。 现在跨考计算机呈现…

嵌入式学习记录6.13(qt day1)

一.思维导图 二.练习&#xff08;简单模拟tim界面&#xff09; 2.1代码 mywidget.cpp #include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {this->setWindowTitle("Tim");this->setWindowIcon(QIcon("C:\\Users\\zy\…

基于 Arm 虚拟硬件实现人脸特征提取模型的部署

基于 Arm 虚拟硬件实现人脸特征提取模型的部署 文章目录 1 实验背景1.1 Arm 虚拟硬件介绍1.2 文章简介 2 实验目标3 实验前准备3.1 订阅 Arm 虚拟硬件镜像的百度智能云云服务器 BCC 实例3.2 克隆实验代码 4 实验步骤4.1 配置开发环境4.1.1 配置 CMSIS-Toolbox 环境4.1.2 配置 P…

Internet Download Manager ( 极速下载器 ) 序列号注册码 IDM下载器注册机中文激活破解版

IDM下载器(Internet Download Manager)是一款专业的下载管理软件&#xff0c;它通过多线程技术和智能文件分段技术&#xff0c;有效提升下载速度&#xff0c;并支持断点续传&#xff0c;还具有计划下载功能&#xff0c;用户可以设置特定的下载时间&#xff0c;非常适合需要在特…

FastAdmin后台开发框架 lang 任意文件读取漏洞复现

0x01 产品简介 FastAdmin是一款基于PHPBootstrap的开源后台框架&#xff0c;专为开发者精心打造。它基于ThinkPHP和Bootstrap两大主流技术构建&#xff0c;拥有完善的权限管理系统和一键生成CRUD等强大功能。FastAdmin致力于提高开发效率&#xff0c;降低开发成本&#xff0c;…

语言大模型:开启自然语言处理的新篇章

随着人工智能技术的飞速发展&#xff0c;自然语言处理&#xff08;NLP&#xff09;领域取得了显著的成果。其中&#xff0c;语言大模型&#xff08;Language Models&#xff09;作为近年来崛起的一种新型神经网络模型&#xff0c;已经在文本生成、机器翻译、情感分析等多个NLP任…

Eigne库安装及使用教程

文章目录 1.Eigne库介绍2.Eigne库安装3.Eigne库使用4.some examples5.参考文献 1.Eigne库介绍 Eigen是可以用来进行线性代数、矩阵、向量操作等运算的C库&#xff0c;它里面包含了很多算法。它的License是MPL2。它支持多平台。 Eigen采用源码的方式提供给用户使用&#xff0c;在…

word空白页删除不了怎么办?

上方菜单栏点击“视图”&#xff0c;下方点击“大纲视图”。找到文档分页符的位置。将光标放在要删除的分节符前&#xff0c;按下键盘上的“Delet”键删除分页符。

Python机器学习完整流程:从数据清洗到推理落地

目录 一、引言 二、数据清洗 数据加载与初步探索 缺失值处理 异常值处理 特征编码与转换 数据集划分 三、模型训练 四、模型文件生成 五、模型部署与推理落地 六、总结 一、引言 在当今数据驱动的时代&#xff0c;机器学习已成为解决复杂问题的有力工具。而…