内存操作函数(C语言)

news2025/1/9 16:44:10

目录

memcpy使用和模拟实现

memcpy函数的模拟实现 

memmove的使用和模拟实现

memmove的模拟实现

memset函数的使用

memcmp函数的使用


memcpy使用和模拟实现

mem--memory--记忆--内存

  • 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置
  • 这个函数在遇到'\0'的时候并不会停下来
  • 如果source和destination有任何的重叠,复制的结果都是未定义的
void* memcpy(void* destination, const void* source, size_t num);
memcpy函数的模拟实现 
#include <stdio.h>
#include <string.h>
#include <assert.h>
//void* memcpy(void* destination, const void* source, size_t num);
//memcpy函数拷贝结束后,会返回目标空间的起始位置
void* my_memcpy(void* dest, const void* src, size_t num)//针对各种内存块
{
	int i = 0;
	void* ret = dest;
	assert(dest && src);//断言不要是空指针
	while (num--)
	{
		*(char*)dest = *(char*)src;//强转
		//使用char*类型的指针解引用访问1个字节
		src = (char*)src + 1;//也可以写成((char*)src)++;注意,括号不要少
		dest = (char*)dest + 1;
	}
	return ret;
}
int main()
{
	//strcpy--字符串的拷贝
	//memcpy--针对内存块进行拷贝
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[20] = { 0 };
	my_memcpy(arr2, arr1, 20);//20个字节,5个整型
	for (int i = 0; i < 20; i++)
	{
		printf("%d ", arr2[i]);//1 2 3 4 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
	}
	return 0;
}

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

memmove的使用和模拟实现

  • 和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重复的
  • 如果源空间和目标空间出现重复,就得使用memmove函数处理
void* memmove(void* destination, const void* source, size_t num);
#include <stdio.h>
#include <string.h>
//void* memmove(void* destination, const void* source, size_t num);

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	memmove(arr + 2, arr, 5 * sizeof(int));
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);//1 2 1 2 3 4 5 8 9 10
	}
	return 0;
}
memmove的模拟实现
#include <stdio.h>
#include <string.h>
#include <assert.h>
//void* memmove(void* destination, const void* source, size_t num);
//memmove函数拷贝结束后,会返回目标空间的起始位置
void* my_memmove(void* dest, void* src, size_t num)
{
	assert(dest && src);
	void* ret = dest;
	if (dest < src)
	{
		//前->后
		while (num--)
		{
			*(char*)dest = *(char*)src;
			dest = (char*)dest + 1;
			src = (char*)src + 1;

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

memset函数的使用

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

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

#include <stdio.h>
#include <string.h>
//void* memeset(void* ptr, int value, size_t num);
int main()
{
	char arr[] = "hello world";
	memset(arr, 'x', 5);
	printf("%s", arr);//xxxxx world
	return 0;
}
int main()
{
	int arr[5] = { 0 };
	memset(arr, 1, 20);//以字节为单位,而不是元素
	for (int i = 0; i < 5; i++)
	{
		printf("%d ", arr[i]);//16843009 16843009 16843009 16843009 16843009
	}
	return 0;
}

memcmp函数的使用

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

比较从ptr1和ptr2指针指向的位置开始,向后的num个字节(内存块的比较)

 

#include <stdio.h>
#include <string.h>
//int memcmp(const void* ptr1, const void* ptr2, size_t num);
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7 };
	int arr2[] = { 1,2,3,4,8,8,8 };
	int ret = memcmp(arr1, arr2, 16);//16个字节
	printf("%d", ret);//0
	return 0;
}

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

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

相关文章

springcloud:4.1 GateWay

概述 Gateway 简介 Spring Cloud Gateway基于Spring 5.0、SpringBoot 2.0和Project Reactor等技术开发 旨在为微服务架构提供一种简单有效的、统一的API路由管理方式&#xff0c;并为微服务架构提供安全、监控、指标和弹性等功能 其目标是替代Zuul特点 易于编写谓词和过滤器&…

MM1: Methods, Analysis Insights from Multimodal LLM Pre-training

MM1: Methods, Analysis & Insights from Multimodal LLM Pre-training 相关链接&#xff1a;arxiv 关键字&#xff1a;多模态学习、大型语言模型、预训练、视觉语言连接、混合专家模型 摘要 本文讨论了构建高性能的多模态大型语言模型&#xff08;MLLMs&#xff09;。特别…

OPTIONS请求(跨域预检查)

目录 一、什么是OPTIONS请求&#xff1f;二、简单请求、复杂请求三、特定的请求头、响应头 一、什么是OPTIONS请求&#xff1f; OPTIONS 请求方式是 HTTP 协议中的一种&#xff0c;主要用于 从响应头中获取服务器支持的HTTP请求方式。 OPTIONS 请求方式是 浏览级行为&#xf…

【SpringCloud微服务实战02】Ribbon 负载均衡

Ribbon使用 Eureka中已经集成了Ribbon,无需额外引入,通过 @LoadBalanced 注解在请求中使用 Ribbon 负载均衡: @Bean @LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate(); } Ribbon工作流程图 Ribbon负载均衡策略 修改Ribbon负载均衡策略 方式一…

从0开始启动一个Django的docker服务

本文是从0开始启动一个Django的docker服务&#xff0c;包括构建镜像,uwsgi启动服务 在服务器上安装ssh&#xff0c;git&#xff0c;生成公钥并复制到服务器上 # 安装ssh yum install openssh-clients # 生成sshkey ssh-keygen # 查看公钥 cat /root/.ssh/id_rsa.pubclone一下…

Text-to-SQL 工具Vanna | 查看训练数据、删除训练数据

1.查看训练数据vn.get_training_data vn.get_training_data 源码如下&#xff0c;可以看到返回的是df格式的数据 abstractmethoddef get_training_data(self, **kwargs) -> pd.DataFrame:"""Example:pythonvn.get_training_data()This method is used to ge…

Brute Force 算法介绍

Brute Force 算法介绍 Brute Force 算法&#xff1a;简称为 BF 算法。中文意思是暴力匹配算法&#xff0c;也可以叫做朴素匹配算法。 BF 算法思想&#xff1a;对于给定文本串 T 与模式串 p&#xff0c;从文本串的第一个字符开始与模式串 p 的第一个字符进行比较&#xff0c;如果…

计算机考研|408专业课复习教程+注意事项

408其实把真题琢磨透就已经可以了&#xff01;其实大部分考研党复习到最后真题都来不及刷完就要上考场 因为在考研后期时间分配真的很困难&#xff01;特别是数学和408 本人双非科班出身备考408成功上岸&#xff0c;在这里也想给想考408的学弟学妹们一些很中肯的&#xff0c;…

干重活儿的互联网

接女儿放学路过欧尚超市&#xff0c;我说 “十年前我每周末推着小车带你去超市&#xff0c;那时没有这么多送外卖的&#xff0c;什么东西都要自己跑过去买”&#xff0c;“你的意思是要表达科技获得很大进步了吗&#xff1f;” 女儿反问&#xff0c;“不&#xff0c;恰恰相反&a…

FTP协议的工作原理:探索端口21的角色

FTP协议的工作原理&#xff1a;探索端口21的角色 在网络协议的众多家族中&#xff0c;文件传输协议&#xff08;FTP&#xff09;以其稳定性和高效性在文件上传和下载领域占有一席之地。FTP的设计允许用户在客户端和服务器之间进行文件传输&#xff0c;而理解其背后的端口机制是…

<JavaEE> 了解网络层协议 -- IP协议

目录 初识IP协议 什么是IP协议&#xff1f; IP协议中的基础概念 IP协议格式 图示 4bit版本号&#xff08;version&#xff09; 4bit头部长度&#xff08;headerlength&#xff09; 8bit服务类型&#xff08;TypeOfService&#xff09; 16bit总长度&#xff08;total l…

Java面试——SQL 语句题

优质博文&#xff1a;IT-BLOG-CN 一、行转列问题 现有表格A&#xff0c;按照以下格式排列&#xff1b; 姓名收入类型收入金额Tom年奖金5wTom月工资10kJack年奖金8wJack月工资12k 先需要将表格转化为&#xff1a; 姓名月工资年奖金Tom10k50kJack12k80k 方法一&#xff1a;…

C语言-strstr(字符串里查找字符串)

strstr&#xff08;字符串里查找字符串&#xff09; 语法格式 库函数实现的逻辑 1&#xff0c;返回一个指向str2在str1中第一次出现的位置&#xff0c;如果str2不是p&#xff0c;则返回一个空指针&#xff0c;函数返回字符串str2在字符串str1中第一次出现的位置) 2&#xf…

SpringBoot3项目框架搭建

注意jdk版本必须17以上才能运行 1、创建Maven工程 2、导入spring-boot-stater-web起步依赖 3、编写Controller 4、提供启动类 5、访问http://localhost:8080/hello

计算机丢失vcruntime140.dll解决办法分享,有效解决vcruntime140.dll丢失问题

vcruntime140.dll是一个属于 Visual C Redistributable for Visual Studio 2015 的动态链接库文件。这个文件是运行那些用 Visual Studio 2015 或相关版本开发的 C 应用程序必不可少的一部分。如果系统中缺少此文件&#xff0c;或文件损坏&#xff0c;则可能会在尝试启动相关软…

[【Hello,PyQt】pyqt5中的QLineEdit控件

PyQt5 是一个强大的Python库&#xff0c;用于创建图形用户界面&#xff08;GUI&#xff09;。其中&#xff0c;QLineEdit 控件作为一个简单而实用的组件&#xff0c;经常用于接受用户的单行文本输入&#xff0c;甚至可以用来进行输入格式的限制。这篇博客中将介绍 QLineEdit 控…

react-native使用FireBase实现google登陆

一、前置操作 首先下载这个包 yarn add react-native-google-signin/google-signin 二、Google cloud配置 Google Cloud 去google控制台新建一个android项目&#xff0c;这时候需要用到你自己创建的keystore的sha1值&#xff0c;然后会让你下载一个JSON文件&#xff0c;先保…

【电路笔记】-金属氧化物半导体晶体管(MOSFET)

金属氧化物半导体晶体管(MOSFET) 文章目录 金属氧化物半导体晶体管(MOSFET)1、概述2、MOSFET 基本结构和符号2.1 耗尽型 MOSFET2.2 增强型MOSFET3、MOSFET放大器4、总结1、概述 除了结型场效应晶体管 (JFET) 之外,还有另一种类型的场效应晶体管,其栅极输入与主载流通道电绝缘…

计算机网络—VLAN 配置

目录 1.拓扑图 2.实验环境准备 2.关闭不相关接口&#xff0c;并配置 Trunk 3.创建 VLAN 4.为客户端配置 IP地址 5.检测设备连通性&#xff0c;验证 VLAN 配置结果 6.配置 Hybrid 端口 7.配置文件 1.拓扑图 2.实验环境准备 在S1和S2上创建Eth-Trunk 1并配置该Eth-Trunk…

JVM-5

1.选择垃圾收集器 如果你的堆大小不是很大&#xff08;比如 100MB &#xff09;&#xff0c;选择串行收集器一般是效率最高的。 参数&#xff1a; -XX:UseSerialGC 。如果你的应用运行在单核的机器上&#xff0c;或者你的虚拟机核数只有单核&#xff0c;选择串行收集器依然是合…