内存函数(memcpy/memmove/memcmp/memset)

news2024/11/18 1:37:07

目录

  • memcpy
    • memcpy函数的模拟实现
  • memmove
    • memmove函数的模拟实现
  • memcmp
  • memset

memcpy

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

  • 函数memcpysource的位置开始向后复制num个字节的数据到destination的内存位置
  • 这个函数在遇到 ‘\0’ 的时候并不会停下来
  • memcpy函数是用来处理不重叠的内存拷贝
  1. 若复制自身,会将自身改变导致无法得到想要的情景出现
  2. 但是有些编译器上是可以完成重叠拷贝的,但不是所有的编译器都可以实现的,重叠拷贝建议使用memmove
  • 函数拷贝结束后,返回目标空间的起始地址
  • 头文件为#include<string.h>

memcpy函数的模拟实现

主函数

int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[20] = { 0 };
	my_memcpy(arr2, arr1, 20);
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr2[i]);
	}
	return 0;
}

my_memcpy函数

#include<assert.h>
void* my_memcpy(void* dest, const void* src, size_t num)
{
	void* ret = dest;
	assert(dest && src);
	while (num--)
	{
		*(char*)dest = *(char*)src;
		dest = (char*)dest + 1;
		src = (char*)src + 1;
	}
	return ret;
}
  1. 函数拷贝结束后,返回目标空间的起始地址,所以先将dest的起始地址保存给ret,结束后用于返回
  2. num接收到的是字节,为使得任意类型的数据都可使用此函数,所以将destsrc强制类型转换成(char*),每次一个字节一个字节进行复制
  3. 每个字节复制结束后,应将地址加一个字节,由于destsrc的类型不确定,所以地址+1时也应先将destsrc强转为(char*)类型在进行地址+1

memmove

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

  • memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的
  • 如果源空间和目标空间出现重叠,就得使用memmove函数处理

memmove函数的模拟实现

主函数

int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	my_memmove(arr1 + 2, arr1, 20);
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr1[i]);
	}
	return 0;
}

my_memmove函数

#include<assert.h>
void* my_memmove(void* dest, const void* src, size_t num)
{
	void* ret = dest;
	assert(dest && src);
	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;
}

memmove函数可以复制自身,所以会有三种情况出现:
(将 src复制给dest

  1. dest < src ------从前向后进行复制

这时需要从前向后进行复制,否则接下来的6,5会被7,8进行覆盖,导致arr1最终变为{7,8,7,8,7,8,7,8,9,10}

在这里插入图片描述

  1. dest < src ------从后向前进行复制

这时需要从后向前进行复制,否则接下来的3,4会被1,2进行覆盖,导致arr1最终变为{1,2,1,2,1,2,1,2,9,10}

在这里插入图片描述

  1. dest = src ------从后向前进行复制

这时这种都可

memcmp

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

  • 比较从ptr1和ptr2指针开始的num个字节
  • 标准规定:
  1. 在两个内存块中不匹配的第一个字节在ptr1中的值高于ptr2中的值(如果作为unsigned char值计算),则返回大于0的数字
  2. 两个内存块的内容是相等的,则返回0
  3. 在两个内存块中不匹配的第一个字节在ptr1中的值低于ptr2中的值(如果作为unsigned char值计算),则返回小于0的数字
  • 头文件为#include<string.h>

例题

int main()
{
	int arr1[] = { 1,2,1 };
	int arr2[] = { 1,2,257 };
	int ret = memcmp(arr1, arr2, 9);
	printf("%d\n", ret);
	return 0;
}

打印结果为:0

分析
通过查看内存
在这里插入图片描述
前9位字节在内存中arr1arr2相同,所以只比较前9位字节时,大小相同

memset

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

  • ptr指向的内存块的前num个字节设置为指定的值(解释为unsigned char)
  • 以字节为单位
  • 返回prt

例题理解

int main()
{
	int arr[] = { 0 };
	memset(arr, 1, 10);
	return 0;
}

看内存
在这里插入图片描述
只进行10个字节转换为1,而不是将10个元素全部转换为1

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

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

相关文章

实战Kafka的部署

目录 一、环境准备 二、安装配置jdk8 &#xff08;1&#xff09;Kafka、Zookeeper&#xff08;简称&#xff1a;ZK&#xff09;运行依赖jdk8 三、安装配置ZK &#xff08;1&#xff09;安装 &#xff08;2&#xff09;配置 四、配置Kafka &#xff08;1&#xff09;配置…

day08_面向对象基础_内存关系

零、今日内容 一、作业 二、面向对象 一、作业 package com.qf.homework;import java.util.Arrays;/*** --- 天道酬勤 ---** author QiuShiju* date 2024/2/28* desc*/ public class Homework {public static void main(String[] args) {test();}//写一个方法 用于合并两个int…

golang 泛型详解

目录 概念 ~int vs .int 常见的用途和错误 结论&#xff1a; 概念 Go 在1.18 中添加了泛型&#xff0c;这样Go 就可以在定义时不定义类型&#xff0c;而是在使用时进行类型的定义&#xff0c;并且还可以在编译期间对参数类型进行校验。Go 目前只支持泛型方法&#xff0c;还…

无源蜂鸣器驱动实验

1.原理 计划是&#xff0c;生成不同的7个频率控制蜂鸣器发声&#xff0c;每个音调发声0.5秒。 50MHZ计数0.5秒&#xff0c;50MHZ一个周期20ns&#xff0c;要计数0.5秒 &#xff0c;0.5/0.000_000_02s25000_000个时钟周期。因为是从0开始计数&#xff0c;所以计数的最大值是0-24…

docker版本 jenkins配置gitlab自动部署

前端项目 Build steps pwd npm config set registry https://registry.npm.taobao.org npm -v node -v #npm install npm run build:prod tar -czvf QASystem.tar.gz distpwd cd /data/zhouxy37/vue_deploy tar -zxvf QASystem.tar.gz sudo mv dist QASystem cp -r QASyste…

K8S常用kubectl命令汇总(持续更新中)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

NGINX的重写与反向代理机制解析

目录 引言 一、重写功能 &#xff08;一&#xff09;if指令 1.判断访问使用的协议 2.判断文件 &#xff08;二&#xff09;return指令 1.设置返回状态码 2.返回指定内容 3.指定URL &#xff08;三&#xff09;set指令 1.手动输入变量值 2.调用其它变量值为自定义变…

web学习笔记(二十二)DOM开始

目录 1.DOM简介 2.DOM树 3.DOM节点 4.查找DOM节点方法汇总 5.查找子结点的属性 5.1父子关系 5.2兄弟关系 6.几个特殊元素的查找 1.DOM简介 DOM&#xff08;Document Object Model&#xff09; 也叫页面文档对象模型&#xff0c;是W3C组织推荐的处理可扩展标记语言(HTML…

蓝桥杯第十二届电子类单片机组程序设计

目录 前言 蓝桥杯大赛历届真题_蓝桥杯 - 蓝桥云课&#xff08;点击查看&#xff09; 单片机资源数据包_2023&#xff08;点击下载&#xff09; 一、第十二届比赛原题 1.比赛题目 2.题目解读 蓝桥杯第十四届电子类单片机组程序设计_蓝桥杯单片机哪一届最难-CSDN博客 二、…

TV-SAM 新型零样本医学图像分割算法:GPT-4语言处理 + GLIP视觉理解 + SAM分割技术

TV-SAM 新型零样本医学图像分割算法&#xff1a;GPT-4语言处理 GLIP视觉理解 SAM分割技术 提出背景TV-SAM 方法论 提出背景 论文&#xff1a;https://arxiv.org/ftp/arxiv/papers/2402/2402.15759.pdf 代码&#xff1a;https://github.com/JZK00/TV-SAM 利用了GPT-4的强大语…

深入理解Spring Security

第1章&#xff1a;Spring Security简介 大家好&#xff0c;我是小黑&#xff0c;在谈到网站安全的时候&#xff0c;Spring Security是个避不开的话题。它就像是个守门员&#xff0c;决定谁能进入我们的网站&#xff0c;又能在网站的哪些角落里走动。简单来说&#xff0c;Sprin…

语音合成(TTS) GPT-SoVITS认知

写在前面 小伙伴推荐&#xff0c;简单了解相对之前试过的其他的TTS项目&#xff0c;GPT-SoVITS的优点简单易用&#xff0c;文档完整&#xff0c;默认的模型效果就很好理解不足小伙伴帮忙指正 不必太纠结于当下&#xff0c;也不必太忧虑未来&#xff0c;当你经历过一些事情的时候…

智能驾驶控制规划理论学习02-基于搜索的路径规划算法

目录 一、路径搜索问题 二、图论基础 三、图搜索方法 1、广度优先搜索&#xff08;BFS&#xff09; bfs与dfs的区别 bfs的搜索过程 bfs的算法实现 2、迪杰斯特拉算法&#xff08;Dijkstra&#xff09; 核心思想 优先级队列 Dijkstra搜索过程 Dijkstra优缺点…

MySQL(基础篇)——函数、约束

一.函数 1.定义 函数是指一段可以直接被另一段程序调用的程序或代码。 2.字符串函数 常见如下&#xff1a; -- 字符串拼接 SELECT CONCAT(hello,MySql) AS CONCAT -- 将字符串全部转为小写 SELECT LOWER(HEllo MYSql) AS LOWER -- 将字符串全部转为大写 SELECT UPPER(Hello…

前端mock数据 —— 使用Apifox mock页面所需数据

前端mock数据 —— 使用Apifox 一、使用教程二、本地请求Apifox所mock的接口 一、使用教程 在首页进行新建项目&#xff1a; 新建项目名称&#xff1a; 新建接口&#xff1a; 创建json&#xff1a; 请求方法&#xff1a; GET。URL&#xff1a; api/basis。响应类型&#xff1…

用Flutter开发App:助力您的移动业务腾飞

一、Flutter简介 Flutter是Google推出的用于构建多平台应用程序的开源UI框架。它使用Dart语言编写&#xff0c;可以编译为原生机器代码&#xff0c;从而提供卓越的性能和流畅的用户体验。 二、Flutter的优势 一套代码&#xff0c;多平台部署&#xff1a;Flutter可以使用一套代…

183896-00-6,Biotin-C3-PEG3-C3-NH2,可以选择性降解靶蛋白

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;183896-00-6&#xff0c;Biotin-C3-PEG3-C3-NH2&#xff0c;Biotin-C3-PEG3-C3-amine&#xff0c;生物素-C3-PEG3-C3-胺 一、基本信息 【产品简介】&#xff1a;Biotin-PEG3-C3-NH2是一种PROTAC linker&#xff0c;…

Redis在中国火爆,为何MongoDB更受欢迎国外?

一、概念 Redis Redis&#xff08;Remote Dictionary Server&#xff09;是一个使用ANSI C编写的开源、支持网络、基于内存、分布式、可选持久性的键值对存储数据库。Redis是由Salvatore Sanfilippo于2009年启动开发的&#xff0c;首个版本于同年5月发布。 MongoDB MongoDB…

Apache Bench(ab )压力测试

目录 参数说明示例1&#xff1a;压力测试示例2&#xff1a;测试post接口post数据文件该如何编写&#xff1f; apr_pollset_poll: The timeout specified has expired (70007)apr_socket_recv: Connection reset by peer (104)参考 参数说明 官方文档参考这里。 ab -c 100 -n …

JVM——JVM与Java体系结构

文章目录 1、Java及JVM简介1.1、Java是跨平台的语言1.2、JVM是跨语言的平台 2、Java发展里程碑3、Open JDK和Oracle JDK4、虚拟机与JVM4.1、虚拟机4.2、JVM 5、JVM整体结构6、Java代码执行流程7、JVM的架构模型7.1、基于栈式架构的特点7.2、基于寄存器架构的特点 8、JVM的生命周…