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

【C语言内存函数】

目录

1.memcpy

使用

模拟实现

2.memmove

使用

模拟实现

3.memset

使用

4.memcmp

使用


1.memcpy

使用

void * memcpy ( void * destination, const void * source, size_t num );目的地址                源地址        字节数

destination:指向要复制内容的目标数组的指针,类型转换为void*类型的指针。

source:指向要复制的数据源的指针,类型转换为const void*类型的指针。

num:要复制的字节数。size_t是一个无符号整数类型。

1.函数memcpy从源地址(destimation)的位置开始向后复制num个字节的数据到目的地址(source)指向的内存位置

2.这个函数在遇到 '\0' 的时候并不会停下来
3.如果source和destination有任何的重叠,复制的结果都是未定义的。

演示:

int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };int arr2[10] = { 0 };memcpy(arr2, arr1, 20);//从arr1->arr2     20个字节int i = 0;
//这里打印10个方便查看for (i = 0; i < 10; i++){printf("%d ", arr2[i]);}return 0;
}

结果:

模拟实现

void* my_memcpy(void* dest, const void* src, size_t num)
{assert(dest);//判断是否为空assert(src);void* ret = dest;//防止返回的地址变动
//逐个传入while (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[10] = { 0 };my_memcpy(arr2, arr1, 20);//从arr1->arr2     20个字节int i = 0;
//这里打印10个方便查看for (i = 0; i < 10; i++){printf("%d ", arr2[i]);}return 0;
}

结果:

2.memmove

使用

其实跟memcpy差不多

void * memmove ( void * destination, const void * source, size_t num );目的地址                源地址        字节数

destination:指向要复制内容的目标数组的指针,类型转换为void*类型的指针。
source:指向要复制的数据源的指针,类型转换为constvoid*类型的指针。
num:要复制的字节数。size t是一个无符号整数类型。

1.将num字节的值从源地址指向的位置复制到目的地址指向的内存块。

2.复制就像使用了中间缓冲区一样进行,从而允许目标和源重叠。

3.当源地址看见和目标地址出现重叠,可以使用memmove


 演示一下,如何重叠的

将源地址的数据传入源地址内(实现在同一个看见重叠)

int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//将源地址数据传入(源地址+2) 发生重叠memmove(arr + 2, arr, 20);int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr[i]);}return 0;
}

这里传入的20个字节  从(arr+2)开始   后面20个字节进行重叠

模拟实现

void* my_memmove(void* dest, const void* src, size_t count)
{assert(src);//判断是否为空void* ret = dest;//防止返回的地址变动
//这里进行判断位置  从哪里开始进行替换if (dest <= src || (char*)dest >= ((char*)src + count)) {while (count--) {*(char*)dest = *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;}}else {dest = (char*)dest + count - 1;src = (char*)src + count - 1;while (count--) {*(char*)dest = *(char*)src;dest = (char*)dest - 1;src = (char*)src - 1;}}return(ret);
}
int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,10 };my_memmove(arr + 2, arr, 20);int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr[i]);}return 0;
}

结果:

3.memset

使用

void * memset ( void * ptr, int value, size_t num );源地址   要变的内容   字节数

ptr指针,指向要填充的内存块。
value:进行设置。该值以int形式传递,但函数使用该值的无符号字符转换填充内存块。
num:要设置为值的字节数。size_t是一个无符号整数类型。

1.设置内存,将内存中的值以字节为单位设置成想要的内容。

这里就不模拟了(循环替换)

int main()
{char str[] = "hello qingtian";memset(str, 'x', 5);printf(str);return 0;
}

结果:

4.memcmp

使用

int memcmp ( const void * ptr1, const void * ptr2, size_t num );地址1                   地址2        字节数

ptr1:内存块的指针。
ptr2:内存块的指针。
num:要比较的字节数。

1.进行比较ptr1和ptr2 从0开始比较num个

int main()
{char arr1[] = "abcdef";char arr2[] = "abdd";int n;n = memcmp(arr1, arr2, sizeof(arr2));if (n > 0)printf("'%s' 大于 '%s'\n", arr1, arr2);else if (n < 0)printf("'%s' 小于 '%s'\n", arr1, arr2);elseprintf("'%s' 等于 '%s'\n", arr1, arr2);return 0;
}

相关文章:

  • PHP景区旅游多商户版微信小程序系统源码
  • Kafka 管理TCP连接
  • 《妃梦千年》第二十四章:皇后的考验
  • Java+前后端分离架构+ MySQL8.0.36产科信息管理系统 产科电子病历系统源码
  • AIGI赋能未来:人工智能如何重塑电子电路学习体验
  • 探索金融数据API:现代投资的关键工具
  • 南方航空阿里v2滑块验证码逆向分析思路学习
  • JVM 内存中方法出入栈原理
  • 油猴Safari浏览器插件:Tampermonkey for Mac 下载
  • 修复harbor的/account/sign-in\?globalSearch=b不登录可以查询镜像的问题
  • vue3 滚动条滑动到元素位置时,元素加载
  • Linux——命令执行原理,命令别名
  • LVS FILTER UNUSED OPTION
  • 【WEB前端2024】3D智体编程:乔布斯3D纪念馆-第42课-多人联机-实时互动
  • 成人高考本科何时报名-深职训学校帮您规划学习之路
  • [Vue CLI 3] 配置解析之 css.extract
  • 【css3】浏览器内核及其兼容性
  • 【附node操作实例】redis简明入门系列—字符串类型
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • Bootstrap JS插件Alert源码分析
  • DOM的那些事
  • gf框架之分页模块(五) - 自定义分页
  • github指令
  • laravel5.5 视图共享数据
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • React+TypeScript入门
  • Redash本地开发环境搭建
  • spring-boot List转Page
  • vue-cli在webpack的配置文件探究
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 思否第一天
  • 微信小程序设置上一页数据
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • (11)MSP430F5529 定时器B
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (solr系列:一)使用tomcat部署solr服务
  • (二)springcloud实战之config配置中心
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (九)c52学习之旅-定时器
  • (四) Graphivz 颜色选择
  • (一)kafka实战——kafka源码编译启动
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • .net core Swagger 过滤部分Api
  • .net core 控制台应用程序读取配置文件app.config
  • .NET Framework 服务实现监控可观测性最佳实践
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)
  • .Net6 Api Swagger配置
  • .NET企业级应用架构设计系列之结尾篇
  • .Net通用分页类(存储过程分页版,可以选择页码的显示样式,且有中英选择)
  • .NET中使用Redis (二)
  • :=