C - 语言->内存函数

目录

系列文章目录

前言

1. memcpy使⽤和模拟实现

1.2 memcpy函数的模拟实现:

2. memmove 使⽤和模拟实现

2.1memmove的模拟实现:

3. memset 函数的使⽤

4. memcmp 函数的使⽤


系列文章目录


✅作者简介:大家好,我是橘橙黄又青,一个想要与大家共同进步的男人😉😉

🍎个人主页:橘橙黄又青_C语言,指针-CSDN博客


前言

学习c语言的只要内存函数及其模拟实现,掌握函数返回类型,并模拟。

正文开始了

1. memcpy使⽤和模拟实现

void * memcpy ( void * destination, const void * source, size_t num );

函数内容:作用:复制数据,和前面strcpy相似。返回类型:无返回

1.函数memcpy从source的位置开始 向后复制 num个 字节 的数据到destination指向的内存位置.
2.这个函数在遇到 '\0' 的时候并不会停下来.
3.如果source和destination有任何的重叠,复制的结果都是未定义的.
也就是说:c语言对memcpy的定义是对 不重复内存数据类型进行复制,举个例子:
arr[20] = {1, 2,3, 4, 5, 6, 7, 8}
memcpy(arr, arr+3, 4)//把arr[2]向后的4个字节复制到arr向后的4个字节

memcpy复制都是在同一个数组,内存重叠了,这样是错误的。

memcpy的正确使用例子,代码1:

#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);//把arr前面4个整形拷贝到arr2中int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr2[i]);}return 0;
}

输出结果:

1.2 memcpy函数的模拟实现:

#include <stdio.h>
#include <string.h>void * my_memcpy ( void * dst, const void * src, size_t count)//以字节单位复制
{void * ret = dst;assert(dst);//断言是否为NULLassert(src);while (count--) {//搬运conut个字节*(char *)dst = *(char *)src;//void不能解引用,强制转换后,在解引用。dst = (char *)dst + 1;//det++;但是void类型不能++,所以可以写成(char*)dst++;但是一些编译器不支持,所以最好写成改代码这样。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 + 3, 5 * sizeof(arr[0]);//把4, 5, 6, 7,8复制到arr2去int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr2[i]);}return 0;
}

那对于重叠的内存数据怎么解决呢?cy语言对于重叠的内存,交给memmove来处理。

2. memmove 使⽤和模拟实现

函数内容:

void * memmove ( void * destination, const void * source, size_t num );

函数内容:作用:复制数据。返回类型:无返回。

1.和memcpy的差别就是memmove函数处理的源内存块和⽬标内存块是可以重叠的。
2.如果源空间和⽬标空间出现重叠,就得使⽤memmove函数处理。
举例1:
#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);//把12345,拷贝到arr1中的34567上。int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr[i]);}return 0;
}

输出结果:

2.1memmove的模拟实现:

代码分析时有3种情况,待我慢慢给你们分析:

void* my_memmove(void* dst, const void* src, size_t count)
{void* ret = dst;if (dst <= src || (char*)dst >= ((char*)src + count)) {//从后面往前面复制,是第1.2种情况while (count--) {*(char*)dst = *(char*)src;dst = (char*)dst + 1;src = (char*)src + 1;}}else {//从前面往后面复制.第3种情况选择从前面往后面复制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);
}
#include <stdio.h>
#include <string.h>
int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };my_memmove(arr1 + 2, arr1, 20);//把1234,拷贝到arr1中的3456上。int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr1[i]);}return 0;
}

第1种情况:

第2种情况:

第3种情况:

分析第2种:

3. memset 函数的使⽤

函数内容:

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

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

案例1:

#include <stdio.h>
#include <string.h>
int main ()
{char str[] = "hello world";memset (str,'x',6);//把str前面6个字节换成xprintf(str);return 0;
}

输出结果:

这里我们给一个错误案例2:

#include <stdio.h>
#include <string.h>
int main()
{int arr[10] = { 0 };memset(arr, 1, 40);printf(arr);return 0;
}

输出结果:

总结:memset函数是以字节为单位来改的

4. memcmp 函数的使⽤

函数内容:

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

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

返回类型:int,以strcmo相似。

案例1:

#include <stdio.h>
#include <string.h>
int main()
{char buffer1[] = "DWgaOtP12df0";char buffer2[] = "DWGAOTP12DF0";int 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.hqwc.cn/news/265065.html

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

相关文章

C++[面向对象的程序设计]_基础入门(中)(万字总结)(建议收藏!!!)

目录 2. C 核心编程 2.1 程序的内存模型 2.1.1 内存四区 - 代码区 2.1.2 内存四区 - 全局区 2.1.3 内存四区 - 栈区 2.1.4 内存四区 - 堆区 2.1.5 new 运算符 2.2 C 中的引用 2.2.1 引用的基本语法 2.2.2 引用的注意事项 2.2.3 引用做函数参数 2.2.4 引用做函数返回…

VMALL 商城系统

SpringBoot MySQL Vue等技术实现 技术栈 核心框架&#xff1a;SpringBoot 持久层框架&#xff1a;MyBatis 模板框架&#xff1a;Vue 数据库&#xff1a;MySQL 阿里云短信&#xff0c;对象存储OSS 项目包含源码和数据库文件。 效果图如下&#xff1a;

双十二哪款超声波清洗机性价比高?性价比高超声波清洗机推荐

距离双十二还有一天时间了&#xff0c;有没有眼镜党朋友还没有选购好超声波清洗机。眼镜清洗用超声波清洗机清洗可以非常省事&#xff0c;不仅能清洗眼镜还可以清洗日常生活中的一些小物件&#xff0c;可以说是非常方便的一个智能清洁工具&#xff0c;非常适合上班族以及眼镜党…

SpringDataJPA基础

简介 Spring Data为数据访问层提供了熟悉且一致的Spring编程模版&#xff0c;对于每种持久性存储&#xff0c;业务代码通常需要提供不同存储库提供对不同CURD持久化操作。Spring Data为这些持久性存储以及特定实现提供了通用的接口和模版。其目的是统一简化对不同类型持久性存储…

静态SOCKS5的未来发展趋势和新兴应用场景

随着网络技术的不断发展和进步&#xff0c;静态SOCKS5代理也在不断地完善和发展。未来&#xff0c;静态SOCKS5代理将会呈现以下发展趋势和新兴应用场景。 一、发展趋势 安全性更高&#xff1a;随着网络安全问题的日益突出&#xff0c;用户对代理服务器的安全性要求也越来越高…

Java项目-瑞吉外卖Day2

完善登录功能&#xff1a; 完善未登录不能访问/backend/index.html。使用拦截器或过滤器。 创建过滤器。 重写doFilter方法。 查看是否过滤成功。 处理流程如下&#xff1a; 添加员工功能&#xff1a; 点击保存&#xff0c;可以看到请求信息。 再看前端代码&a…

「大模型摇摇乐」硬核教程:零基础搞定文案生成应用!

大模型趣味赛「大模型摇摇乐」活动火热进行中。想要更加了解本次活动的规则并拿到更丰富的奖励吗&#xff1f;快来看本教程吧&#xff01;本文将以“AI 一键生成文案”为例进行教程讲解&#xff5e; 项目简介 设计背景 为什么做这个项目 在社交媒体日益流行的时代&#xff…

PC端视频网站系统源码 系统自带采集功能 附带完整的搭建教程

近年来&#xff0c;视频内容已成为人们日常生活中不可或缺的一部分。下面罗峰给大家分享一款PC端视频网站系统源码&#xff0c;该系统具有强大的采集功能&#xff0c;可轻松实现视频内容的自动更新和丰富。并附带完整的搭建教程&#xff0c;帮助您快速构建属于自己的视频网站。…

Java+Swing: 连接数据库并完成登录验证 整理10

1. 封装连接数据库的工具类 package com.utils;import java.sql.*;/*** Author&#xff1a;xiexu* Date&#xff1a;2023/12/11 10:13*/ // 连接数据库的工具类 public class DBUtil {private static final String URL "jdbc:mysql://localhost:3306/student_score?use…

tidb安装 centos7单机集群

安装 [rootlocalhost ~]# curl --proto https --tlsv1.2 -sSf https://tiup-mirrors.pingcap.com/install.sh | sh [rootlocalhost ~]# source .bash_profile [rootlocalhost ~]# which tiup [rootlocalhost ~]# tiup playground v6.1.0 --db 2 --pd 3 --kv 3 --host 192.168.1…

智能优化算法应用:基于缎蓝园丁鸟算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于缎蓝园丁鸟算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于缎蓝园丁鸟算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.缎蓝园丁鸟算法4.实验参数设定5.算法…

CRM系统的这些功能助您高效管理客户

客户管理可以理解为企业收集并利用客户信息&#xff0c;满足客户的需求&#xff0c;从而提升客户价值的过程。CRM系统一直被誉为客户管理的“神器”&#xff0c;下面我们就来说说CRM系统有哪些功能可以管理客户&#xff1f; 1、客户信息管理 CRM可以帮助企业收集客户的基本信…