带你全面了解四大内存操作函数memset(),memcpy(),memmove(),memcmp()(附模拟实现)

news2024/11/28 14:53:58

内存操作函数

文章目录

  • 内存操作函数
    • memcpy
    • memmove
    • memcmp
    • memset

注:点击蓝色标题可以跳转到官方网站查看更权威的解析哦。

memcpy

void * memcpy ( void * destination, const void * source, size_t num );
  • 函数memcpy从source的位置开始,向后复制num个字节的数据到destination的内存位置
  • 这个函数在遇到‘\0’并不会停下来
  • 如果source和destination有任何重叠,复制的结果都是未定义的

具体使用:

#include<stdio.h>

int main()
{
	int num1[20] = { 0 };
	int num2[] = { 1,2,3,4,5 };

	memcpy(num1, num2, sizeof(num2));

	for (int i = 0; i < sizeof(num1) / sizeof(int); i++)
		printf("%d ", num1[i]);
	printf("\n");

	return 0;
}

模拟实现:

#include<stdio.h>

void* my_memcpy(void* destination, const void* source, size_t num)
{
	void* head = destination;
	
	while (num--)
	{
		*(char*)destination = *(char*)source;

		((char*)destination)++;
		((char*)source)++;
	}

	return head;
}

int main()
{
	int num1[20] = { 0 };
	int num2[] = { 1,2,3,4,5 };

	my_memcpy(num1, num2, sizeof(num2));

	for (int i = 0; i < sizeof(num1) / sizeof(int); i++)
		printf("%d ", num1[i]);
	printf("\n");

	return 0;
}

memmove

void * memmove ( void * destination, const void * source, size_t num );
  • 和memcopy的差别就是memmove函数处理的内存块是可以重复的
  • 如果源空间和目标空间出现重复,就得使用memmove函数处理
  • 可以说,memmove比memcpy只强不弱

具体使用:

#include<stdio.h>

int main()
{
	int num[] = { 1,2,3,4,5,6,7,8,9,10 };
	memmove(num + 2, num, 5 * sizeof(int));

	for (int i = 0; i < sizeof(num) / sizeof(int); i++)
		printf("%d ", num[i]);
	printf("\n");
	
	return 0;
}

模拟实现:

#include<stdio.h>

void* my_memmove(void* destination, const void* source, size_t num)
{
	void* head = destination;

	if (destination < source)
	{
		while (num--)
		{
			*(char*)destination = *(char*)source;

			((char*)destination)++;
			((char*)source)++;
		}
	}
	else
	{
		while (num--)
		{
			*((char*)destination + num) = *((char*)source + num);
		}
	}

	return head;
}

int main()
{
	int num[] = { 1,2,3,4,5,6,7,8,9,10 };
	my_memmove(num, num + 2, 5 * sizeof(int));

	for (int i = 0; i < sizeof(num) / sizeof(int); i++)
		printf("%d ", num[i]);
	printf("\n");
	
	return 0;
}

memcmp

int memcmp ( const void * ptr1, const void * ptr2, size_t num );
  • 比较从ptr1和ptr2指针开始的num个字节
  • 返回值如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i5N6MYkk-1689079157120)(C:/Users/HUASHUO/AppData/Roaming/Typora/typora-user-images/image-20230711201027119.png)]

具体使用:

#include<stdio.h>

int main()
{
	int num1[] = { 1,2,3,4,5,6 };
	int num2[] = { 1,2,3,4,5,7 };

	if (memcmp(num1, num2, 6 * sizeof(int)) > 0)
		printf(">\n");
	else if (memcmp(num1, num2, 6 * sizeof(int)) < 0)
		printf("<\n");
	else
		printf("=\n");

	return 0;
}

模拟实现:

#include<stdio.h>

int my_memcmp(const void* ptr1, const void* ptr2, size_t num)
{
	while (num-- && *(char*)ptr1 == *(char*)ptr2)
	{
		((char*)ptr1)++;
		((char*)ptr2)++;
	}

	if (num + 1 == 0)
		return 0;
	else if (*(char*)ptr1 > *(char*)ptr2)
		return 1;
	else
		return -1;
}

int main()
{
	int num1[] = { 1,2,3,4,5,8 };
	int num2[] = { 1,2,3,4,5,7 };

	if (my_memcmp(num1, num2, 6 * sizeof(int)) > 0)
		printf(">\n");
	else if (my_memcmp(num1, num2, 6 * sizeof(int)) < 0)
		printf("<\n");
	else
		printf("=\n");

	return 0;
}

memset

void * memset ( void * ptr, int value, size_t num );
  • Sets the first num bytes of the block of memory pointed by ptr to the specified value (interpreted as an unsigned char).——将 ptr 指向的内存块的第一个字节数设置为指定值(解释为无符号字符)。
  • 即从 ptr 指向的内存块的第一个字节开始,将每个字节的值设为value,直至完成第num个字节的赋值。
  • 一般用于将数组初始化为0

具体使用:

#include<stdio.h>

int main()
{
	int nums[5] = { 1,1,1,1,1 };

	memset(nums, 0, sizeof(nums));

	for (int i = 0; i < sizeof(nums) / sizeof(int); i++)
		printf("%d ", nums[i]);
	printf("\n");

	memset(nums, 1, sizeof(nums));

	for (int i = 0; i < sizeof(nums) / sizeof(int); i++)
		printf("%d ", nums[i]);
	printf("\n");

	return 0;
}

模拟实现:

#include<stdio.h>

void* my_memset(void* ptr, int value, size_t num)
{
	void* head = ptr;

	while (num--)
	{
		*(char*)ptr = value;
		((char*)ptr)++;
	}

	return head;
}

int main()
{
	int nums[5] = { 1,1,1,1,1 };

	my_memset(nums, 0, sizeof(nums));

	for (int i = 0; i < sizeof(nums) / sizeof(int); i++)
		printf("%d ", nums[i]);
	printf("\n");

	my_memset(nums, 1, sizeof(nums));

	for (int i = 0; i < sizeof(nums) / sizeof(int); i++)
		printf("%d ", nums[i]);
	printf("\n");

	return 0;
}

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

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

相关文章

Linux - CentOS 7 源码安装 MySQL 8.0.31

一、mysql-boost-8.0.31.tar.gz 源码下载 下载地址&#xff1a;https://dev.mysql.com 二、源码安装 MySQl 要求 cmake、Boost C库、ncurses库、OpenSSL库 //需要cmake3&#xff0c;gcc-5.3以上&#xff1b; 三、源码搭建 MySQL 环境 1、创建用户名和组 groupadd mysql …

ChatLaw团队招实习生啦!真格基金的创业、投资与AI详细指南;远程工作的8个安全法则;游戏开发者的数学教程 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; 北大 ChatLaw 团队招聘实习生&#xff0c;开放算法和前后端岗位 ChatLaw 是一个开源的中文法律大模型&#xff0c;由北京大学与北大-兔…

vim编辑器中实现左边目录,右边内容布局的方法(vim插件:显示树形目录插件NERDTree安装和使用)

NERDTree&#xff1a;是Vim编辑器的文件系统资源管理器。使用此插件&#xff0c;用户可以直观地浏览复杂的目录层次结构&#xff0c;快速打开文件进行读取或编辑&#xff0c;并执行基本的文件系统操作。 它允许轻松浏览文件&#xff0c;并在不离开vim的情况下执行一些基本操作…

Spring Cloud的基本应用

上篇文章我们的eureka的集群已经搭建完毕,但是我们还没有开始使用,之前我们的page访问的方法是直接写死的,现在我们就可以改为集群的方式来写 Autowired//注册中心对应的客户端对象private DiscoveryClient discoveryClient;RequestMapping("query/{id}")public Prod…

基于51单片机的智能垃圾桶

功能&#xff1a; 本实例是基于51单片机为核心的智能垃圾桶仿真&#xff0c;主要由51单片机最小系统、L298N电机驱动电路、开盖电机、超声波传感器、红外测速模块、直流电机、红外人体传感器、LCD1602显示屏、震动传感器、按键电路构成。 1.系统的传感器主要用人体感应和机体震…

订单结算页+下单业务

一、订单结算页 1.业务分析 (1) 获取用户收货地址信息 一般的收货地址都是多个&#xff0c;使用时选中一个&#xff0c;所以收货地址使用List集合封装 (2)获取购物车商品信息 购物车商品也是多个&#xff0c;使用List集合封装 (3)查询商品库存 查询每个商品是否有库存&#…

VSCode安装及环境配置详细教程(windows版本)

目录 安装VSCode 安装Python 检查环境变量 检查Python是否能运行 VSCode环境配置 切换成简体中文 添加Python插件 编写代码运行 &#xff01;&#xff01;请先在官网下载Python和VSCode安装包&#xff0c;保存至本地 Python官网&#xff1a;https://www.python.org/do…

多元回归预测 | Matlab基于灰狼算法(GWO)优化高斯过程回归(GWO-GPR)的数据回归预测,matlab代码,多变量输入模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元回归预测 | Matlab基于灰狼算法(GWO)优化高斯过程回归(GWO-GPR)的数据回归预测,matlab代码,多变量输入模型 评价指标包括:MAE、RMSE和R2等,代码质量极高,方便学习和替换数据。要求2018版本及以上。 部分源…

APP测试要点有哪些?

我们日常购物、旅游、支付等活动都离不开手机&#xff0c;由此衍生了很多APP。 比如每天使用频率非常高的微信、支付宝、微博、抖音、王者荣耀等等。 APP测试主要进行功能测试、性能测试、自动化测试、安全性测试、兼容性测试、专项测试。 01、APP测试流程 APP测试流程与web测…

软考A计划-系统集成项目管理工程师-项目进度管理-上

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…

python glob库glob函数返回为空时

这里的max函数会报空序列的错误&#xff0c;原因就是glob.glob函数读取不到文件的问题&#xff0c;推测是脚本所在文件夹与传入的文件夹地址不对造成的&#xff0c;比如C&#xff1a;/tor/data/jiaoben.py,而文件所在文件夹是C&#xff1a;/tor/biaobei/

自媒体13条监管新规来了:做自媒体还有前途吗?

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 各位自媒体人&#xff0c;大家一定要逐条逐句&#xff0c;认真研读&#xff0c;领会精神&#xff0c;掌握要求&#xff0c;规范运营好自己的账号&#xff0c;切莫越界踩线&#xff0c;多为广大网友…

邮箱推荐和(警告)使用qq邮箱的坏处

qq如果发布违规消息&#xff0c;比如群聊无意发布会导致你账号封号&#xff0c;而且随着次数增多&#xff0c;会导致永久封号&#xff0c;你的qq音乐&#xff0c;qq浏览器&#xff0c;qq游戏&#xff0c;{qq邮箱}&#xff0c;全部会无法登录&#xff0c;比如需要登陆邮箱验证码…

初学者也能轻松掌握的MQL4编程入门指南

MQL4编程是外汇交易中极为重要的一部分&#xff0c;掌握MQL4编程可以帮助交易者快速创建自己的交易算法&#xff0c;进而提高交易效率和盈利水平。但是对于初学者来说&#xff0c;MQL4编程可能会显得有些困难。本篇文章就是为初学者准备的&#xff0c;针对MQL4编程进行入门指导…

对RAM和ROM的理解

什么是RAM、ROM&#xff1f; RAM(Random Access Memory)随机存取存储器 ROM(Read Only Memory)只读存储器 先记住一件事 RAM断电将失去数据 ROM断电仍会保留数据 RAM、ROM、Flash、内存条、硬盘、SD卡到底怎么归类&#xff1f; 我们先来看下计算机的原理和计算机的需求 …

【Leetcode】59. 螺旋矩阵II

给定一个正整数 n&#xff0c;生成一个包含 1 到 n^2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的正方形矩阵。 示例: 输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ] 面试频率较高 1. 先定义一个空矩阵 2. startx表示行起始 starty表示列起始 3. 左闭右开…

信息安全-加密技术

一、概念 加密是利用数学方法将明文(plain text)转换为密文(cipher),从而达到保护数据的目的。 加密是一个使信息只对正确的接收者可读,其他用户看到的是乱码信息的过程。 加密技术作用 加密技术在网络上的作用就是防止私有化信息在网络上被拦截和窃取。通过加密可保…

性能测试:Jmeter-Beanshell请求加密实例

前言 进行性能测试时&#xff0c;有可能遇到一种场景&#xff1a;接口请求由于安全问题&#xff0c;需要进行加密发送。 这种场景下&#xff0c;使用Jmeter实现性能测试&#xff0c;则也需要使用同样的加密规则发送请求报文。 要实现此类性能测试有几种策略&#xff1a; 直…

纹理环绕方式

一般而言&#xff0c;纹理坐标范围(0,0)到(1,1)&#xff0c;若设置超出该范围&#xff0c;则会按照如下环绕方式处理。 设置纹理参数的函数原型为&#xff1a; 坐标信息&#xff1a; float vertices[] { // positions // colors // texture coords 0.9f, 0.9f, 0.0f, 1.0f,…

线上后端接口响应过慢排查记录_MySQLthread cache命中率过低导致的接口响应慢

文章目录 问题现象初步排查调整临时解决措施问题二次定位原因分析为什么会出现异常 问题现象 9点多&#xff0c;运营同学反馈系统某模块业务响应很慢&#xff0c;登录系统查看&#xff0c;后端接口响应耗时很久&#xff0c;需要好几秒&#xff1b; 查看对应的服务器资源情况&a…