轻松拿捏C语言——【内存函数】

🥰欢迎关注 轻松拿捏C语言系列,来和 小哇 一起进步!

🎉创作不易,请多多支持🎉

🌈感谢大家的阅读、点赞、收藏和关注💕

🌹如有问题,欢迎指正~~


目录👑

💕1. memcpy()💕

函数原型❤️

示例❤️

 函数模拟❤️

🌟🌟2. memmove()

函数原型🌙

示例🌙

函数模拟实现🌙

💕3. memset()💕

函数原型❤️

示例❤️

🌟🌟4. memcmp()

函数原型🌙

示例🌙


C语言中的内存操作函数:memcpy, memmove, memset, memcmp

在C语言中,我们经常需要对内存块进行各种操作,比如复制、移动、设置值以及比较。C标准库提供了四个非常有用的函数来处理这些操作:memcpy, memmove, memset, memcmp

下面我将逐一介绍这些函数及其用法。

💕1. memcpy()💕

用于从源内存块复制指定数量的字节到目标内存块。这个函数不检查源内存和目标内存是否重叠,因此如果重叠,它可能会导致未定义的行为。

函数原型❤️

void *memcpy(void *dest, const void *src, size_t n);
  • dest:指向目标内存块的指针。
  • src:指向源内存块的指针。
  • n:要复制的字节数。
  • 这个函数在遇到 '\0' 的时候并不会停下来。

示例❤️

#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);
 int i = 0;
 for (i = 0; i < 10; i++)
 {
 printf("%d ", arr2[i]);
 }
 return 0;
}

打印 1 2 3 4 5 0 0 0 0 0

#include <stdio.h>  
#include <string.h>  
int main() {  
    char src[] = "Hello, World!";  
    char dest[20];  
    memcpy(dest, src, 13); // 复制前13个字节(包括空字符'\0')  
    printf("%s\n", src);  
    printf("%s\n", dest);  
    return 0;  
}

 函数模拟❤️

法一:

//法一
void* my_memcpy1(void* dest,const void* source, size_t num)
{
	void* ret = dest;
	while (num--)
	{
		//*((char*)dest)++ = *((char*)source)++;
		*(char*)dest = *(char*)source;
		dest = (char*)dest + 1;
		source = (char*)source + 1;
	}
	return ret;
}

int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8 };
	int arr2[5] = { 0 };
	//memcpy(arr2, arr1 + 2, 17);
	my_memcpy1(arr2, arr1 + 2, 17);
    int i;
    for (i = 0; i < 5; i++)
	    printf("%d ", arr1[i]);
	return 0;
}

法二:

//法二
void* my_memcpy2(void* dest, void* src, size_t num)
{
	char* d = (char*)dest;
	char* s = (char*)src;
	while (num--)
	{
		*d++ = *s++;
	}
	return dest;
}
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8 };
	int arr2[5] = { 0 };
	//memcpy(arr2, arr1 + 2, 17);
	my_memcpy2(arr2, arr1 + 2, 17);
    int i;
    for (i = 0; i < 5; i++)
	    printf("%d ", arr2[i]);
	return 0;
}

 打印3 4 5 6 7

🌟🌟2. memmove()

memmove() 函数与 memcpy() 类似,但它可以正确处理源内存和目标内存重叠的情况。

如果源空间和目标空间出现重叠,就得使用memmove函数处理。

memmove也具有memcpy的功能

函数原型🌙

void *memmove(void *dest, const void *src, size_t n);

参数与 memcpy() 相同。

示例🌙

#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);
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr1[i]);
	}
	return 0;
}

打印1 2 1 2 3 4 5 8 9 10

#include <stdio.h>  
#include <string.h>  

int main() {
    char str[] = "Hello, World!";
    memmove(str + 6, str, 5); 
    printf("%s\n", str);

    return 0;
}

 打印Hello,Hellod!

函数模拟实现🌙

void* my_memmove(void* dest, void* src, size_t num)
{
	char* d = (char*)dest;
	char* s = (char*)src;
	if (dest < src)
	{
		while (num--)
			*d++ = *s++;
	}
	else
	{
		while (num--)
			*(d + num) = *(s + num);
	}
	return dest;
}
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	//memmove(arr, arr + 2, 12);

	/*char str[] = "Hello, World!";
	memmove(str + 6, str, 5);
	printf("%s\n",str);*/
	my_memmove(arr, arr + 2, 12);
	int i = 0;
	for (i; i < 10; i++)
		printf("%d ", arr[i]);
	return 0;
}

打印3 4 5 4 5 6 7 8 9 10

💕3. memset()💕

memset() 函数用于将指定内存块的前n个字节设置为某个给定的值(一个无符号字符)。

函数原型❤️

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

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

从地址ptr开始往后的num个字节都设置成value

示例❤️

#include <stdio.h>
#include <string.h>
int main ()
{
 char str[] = "hello world";
 memset (str,'x',6);
 printf(str);
 return 0;
}

输出:xxxxxxworld

#include <stdio.h>  
#include <string.h>  

int main() {
    char str[50]={0};

    memset(str, 'A', 10); // 将str的前10个字节设置为'A'  

    printf("%s\n", str);   

    return 0;
}

  输出 :AAAAAAAAAA

注意:memset() 只会设置到字符串的指定长度,并不会自动添加字符串结束符 '\0'。

🌟🌟4. memcmp()

memcmp() 函数用于比较两个内存块的内容。

函数原型🌙

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

• 比较从ptr1和ptr2指针指向的位置开始,向后的num个字节 

如果ptr1和 ptr2 的前n个字节完全相同,则返回 0;

如果 ptr1小于 ptr2 ,则返回一个小于 0 的值;

如果ptr1大于  ptr2 ,则返回一个大于 0 的值。

示例🌙

#include <stdio.h>
#include <string.h>
int main()
{
	int arr1[] = { 1,2,3,4,5 };
	int arr2[] = { 1,2,3,6,5 };
	int ret = memcmp(arr1, arr2,13);
	printf("%d", ret);//-1
	return 0;
}

打印-1

#include <stdio.h>  
#include <string.h>  

int main()
{
    char str1[] = "Hello";
    char str2[] = "World";

    int result = memcmp(str1, str2, 5); // 比较两个字符串的前5个字节  

    if (result < 0) {
        printf("str1 is less than str2\n");
    }
    else if (result > 0) {
        printf("str1 is greater than str2\n");
    }
    else {
        printf("str1 is equal to str2\n");
    }

    return 0;
}

打印:str1 is less than str2 


 🎉🎉🎉本文内容结束啦,希望各位大佬多多指教

🌹🌹感谢大家三连支持

💕敬请期待~~

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

简单说说我对集成学习算法的一点理解

概要 集成学习&#xff08;Ensemble Learning&#xff09;是一种机器学习技术框架&#xff0c;它通过构建并结合多个学习器&#xff08;也称为个体学习器或基学习器&#xff09;来完成学习任务。 集成学习旨在通过组合多个基学习器的预测结果来提高整体模型的性能。每个基学习…

《mysql轻松学习·二》

1、创建数据表 contacts&#xff1a;数据表名 auto_increament&#xff1a;自动增长 primary key&#xff1a;主键 engineInnoDB default charsetutf8; 默认字符集utf8&#xff0c;不写就默认utf8 对数据表的操作&#xff1a; alter table 数据表名 add sex varchar(1); //添…

MySQL 一条SQL查询/更新语句是如何执行的?

MySQL 一条SQL查询语句是如何执行的&#xff1f; 1 连接器 首先客户端需要先跟服务端进行连接 2 查询缓存 MySQL 5.7 以及之前的版本会查询MySQL缓存&#xff0c;存储是键值对形式的 分析器 对SQL进行词法分析【会生成词法树】以及语法分析 词法分析&#xff1a; 主要负…

安卓ANR检测、分析、优化面面谈

前言 一个引发讨论的楔子&#xff0c;以下三种现象有什么区别&#xff1a; App停止运行App暂无响应App闪退 答案&#xff1a; 产生原因不同&#xff1a;停止运行是UNCheckExceptionError暂无响应是ANRDialog闪退是CheckExceptionError 本文讨论的主题是ANR的定义、分类、复现…

CISCN 2023 初赛 被加密的生产流量

题目附件给了 modbus.pcap 存在多个协议 但是这道题多半是 考 modbus 会发现 每次的 Query 末尾的两个字符 存在规律 猜测是base家族 可以尝试提取流量中的数据 其中Word Count字段中的22871 是10进制转16进制在转ascii字符串 先提取 过滤器判断字段 tshark -r modbus.pcap …

大学校园广播“录编播”与IP校园公共广播系统技术方案

一、项目概述 1、校园IP网络广播系统概述 大学校园广播系统是学校整个弱电系统中的子系统&#xff0c;它是每个学校不可缺少的基础设施之一&#xff0c;在传递校园文化、传播校园新闻资讯方面发挥着重要的作用。近几年来&#xff0c;虽然视频技术和网络技术在飞速发展&#xf…

沟通程序化(1):跟着鬼谷子学沟通—“飞箝”之术

沟通的基础需要倾听&#xff0c;但如果对方听不进你的话&#xff0c;即便你说的再有道理&#xff0c;对方也很难入心。让我们看看鬼谷子的“飞箝”之术能给我们带来什么样的启发吧&#xff01; “飞箝”之术&#xff0c;源自中国古代兵法家、纵横家鼻祖鬼谷子的智慧&#xff0…

基于分步傅立叶数值算法的一维非线性薛定谔方程求解matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于分步傅立叶数值算法的一维非线性薛定谔方程求解matlab仿真. 2.测试软件版本以及运行结果展示 MATLAB2022A版本运行 3.核心程序 ........................…

appium元素定位工具_uiautomatorviewer.bat

特点&#xff1a; uiautomatorviewer是android-sdk自带的元素定位工具uiautomatorviewer只能用于安卓系统&#xff1b;它是通过截屏分析XML布局文件方式&#xff0c;来提供控件信息的查看服务 uiautomatorviewer.bat 基本使用 路径&#xff1a;这个工具是Android SDK中自带&…

【C++】C++11新特性:新的类功能、可变参数模板、STL容器中的empalce相关接口函数、lambda表达式、包装器(function、bind)

目录 一、新的类功能 1.1 移动构造函数和移动赋值运算符重载 1.2 强制生成默认函数的关键字default 1.3 禁止生成默认函数的关键字delete 1.4 其它的类功能 二、可变参数模板 三、STL容器中的empalce相关接口函数 四、lambda表达式 4.1 lambda的引入 4.2 lambda表达式…

Ollama教程,本地部署大模型Ollama,docker安装方法,仅供学习使用

不可商用&#xff01;&#xff01;仅仅提供学习使用&#xff01; 先上视频教学&#xff1a; Ollama教程&#xff0c;本地部署大模型Ollama&#xff0c;docker安装方法&#xff0c;仅供学习使用&#xff01; 资料获取 &#xff1a; Ollama下载包和安装文档在这里&#xff1…

从零到一的程序猿-day2-yoloV4训练及免环境易语言调用

简介 本项目功能介绍&#xff1a;针对4位英文数字随机组合的验证码抽象图片进行分类识别&#xff0c;识别结果为验证码内容 训练 没有难度&#xff0c;手动标注&#xff0c;样本为150张&#xff0c;首先识别出图片中每个英数的位置&#xff0c;再由分类器进行标注识别&#x…

latex bib引参考文献

1.bib内容 2.sn-mathphys-num是官方的参考文献格式 3.不用导cite包&#xff0c;文中这么写 4.end document前ckwx是自己命名的bib的名字

C语言Linux进度条模拟

在Linux字符界面中&#xff0c;使用yum、apt下载东西时会有一个图形化的进度条&#xff0c;可以告诉我们任务的执行进度。 我们也可以通过C语言实现一个类似的进度条&#xff0c;并且可以做得更加美观。以后我们自己写的程序需要显示进度时就可以去调用我们自己实现的进度条。 …

【算法】贪心算法——柠檬水找零

题解&#xff1a;柠檬水找零(贪心算法) 目录 1.题目2.题解3.参考代码4.证明5.总结 1.题目 题目链接&#xff1a;LINK 2.题解 分情况讨论 贪心算法 当顾客为5元时&#xff0c;收下当顾客为10元时&#xff0c;收下10元并找回5元当顾客为20元时&#xff0c;收下20元并找回10…

图像交换部分区域或帧

生成一个boundingbox&#xff0c;或区间 给定矩形框占图像的面积比例&#xff0c;和图像的宽W高H&#xff0c;生成矩形框。根据给定的矩形框&#xff0c;交换两张图像的部分区域。 这里为了方便展示&#xff0c;简化问题&#xff0c;给定一个图像数组mels&#xff0c;对第 i …

基于SSM框架的垃圾分类系统的设计与实现(含源码+sql+开题报告+论文+论文答辩模板)

图1 前台首页截图 首页展示&#xff1a;首页展示法律法规、公示公告、用户交流论坛、分类指南、垃圾站点、以及个人中心&#xff1b; 法律法规&#xff1a;展示我国《城市生活垃圾分类及其评价标准》以及《生活垃圾分类标志》等最新法律法规&#xff1b; 公示公告&#xff1…

【第1章】SpringBoot实战篇之注册接口

文章目录 前言一、代码部分1. User2.UserMapper13. UserSerivce4. UserController15. Result 二、测试1.注册2.再次注册 总结 前言 下面介绍用户注册接口。 一、代码部分 1. User package org.example.springboot3.bigevent.entity;import com.baomidou.mybatisplus.annotat…

【Vulhub】Fastjson 1.2.24_rce复现

文章目录 一&#xff0c;Fastjson是什么&#xff1f;二&#xff0c;fastjson漏洞原理三&#xff0c;判断是否有fastjson反序列化四&#xff0c;复现Fastjson 1.2.24_rce(vulhub)环境配置1.判断是否存在Fastjson反序列化2.反弹shell3.启动RMI服务器4.构造恶意POST请求 一&#x…

FineBi导出Excel后台版实现

就是不通过浏览器,在后台运行的导出 参考文档在:仪表板查看接口- FineBI帮助文档 FineBI帮助文档 我这里是将这个帮助文档中导出的excel文件写到服务器某个地方后,对excel进行其他操作后再下载。由于原有接口耦合了HttpServletRequest req, HttpServletResponse res对象,…