内存函数详解与模拟实现

目录

1.memcpy函数

1.1memmcpy函数的模拟使用

2.memmove函数

2.1memmove 函数的模拟使用

3.memcmp

3.1memcmp函数的模拟实现

4.memset (内存设置)

4.1memset函数的模拟实现


1.memcpy函数

void* memcpy(void* destination, const void* source, size_t num);//之所以是void*类型是因为接收数据无法确认所以用泛型指针

数memcpy从source的位置开始向后复制num个字节数据到destination的内存位置。

这个函数在遇到'\0'的时候并不会停下来。

如果source和destination有任何重叠,复制的结果都是未定义的。

#include<stdio.h>
#include<string.h>
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7 };
	int arr2[20] = { 0 };//我们如果想把arr1拷贝到arr2中,strcpy肯定是行不通的,因为其是字符串拷贝不能拷贝整形
	memcpy(arr2, arr1,28);
	int i = 0;
	for(i=0;i<7;i++)
	{
		printf("%d\n", arr2[i]);
	}
	return 0;
}

1.1memmcpy函数的模拟使用

#include<stdio.h>
#include<stdio.h>
char* my_memcpy(void* dest, void* stc, size_t num)
{
	void* p = dest;
	while (num)
	{
		*((char*)dest) = *((char*)stc);
		((char*)dest)++;
		((char*)stc)++;
		num--;
	}
	return p;
}
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7 };
	int arr2[20] = { 0 };
	my_memcpy(arr2, arr1,28);
	int i = 0;
	for(i=0;i<7;i++)
	{
		printf("%d\n", arr2[i]);
	}
	return 0;
}

如果我们想arr1作为源空间拷贝到目标空间arr1+2中:

#include<stdio.h>
#include<string.h>
int main()
{
	int arr1[20] = { 1,2,3,4,5,6,7,8,9,10 };
	my_memcpy(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,但运行结果却是:

注意:尽量不要自己拷贝自己(新的编译器会自我优化,但版本较低的编译器不能优化),会出现自己覆盖自己的情况 ,重叠字符串的拷贝要用memmove函数。

2.memmove函数

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

#include<stdio.h>
#include<string.h>
int main()
{
	int arr1[20] = { 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;
}

 这和我们想要的结果是完全一样的。

2.1memmove 函数的模拟使用

#include<stdio.h>
void* my_memmove(void* dest, const void* src, size_t num)
{
	void* ret = dest;
	if (dest < src)
	{
		//从前往后拷贝
		while (num--)
		{
			(*(char*)dest) = (*(char*)src);
			((char*)dest)++;
			((char*)src)++;
		}
	}
	else
	{
		//从后往前拷贝
		while (num--)//num先使用后--
		{
			*((char*)dest + num) = *((char*)src + num);//在这里dest、与src并不需要改变因为num会改变
		}
	}
	return ret;
}
int main()
{
	int arr1[20] = { 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;
}

3.memcmp

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

比较从ptrt1和ptr2指针开始的num个字节

返回值如下:

这和strcmp的返回值是基本一致的。

#include<stdio.h>
int main()
{
	int arr1[] = { 1,2,3,4,5 };
	int arr2[] = { 1,3,2 };
	int ret=memcmp(arr1, arr2, 12);
	printf("%d\n", ret);//运行结果为-1
	return 0;
}

3.1memcmp函数的模拟实现

#include<stdio.h>
int my_memcmp(const void* ptr1, const void* ptr2, size_t num)
{
	while(num--)
	{
		if (*(char*)ptr1 > *(char*)ptr2)
			return 1;
		else if (*(char*)ptr1 < *(char*)ptr2)
			return -1;
		else
		{
			((char*)ptr1)++;
			((char*)ptr2)++;
		}
	}
	return 0;
}
int main()
{
	int arr1[] = { 1,2,3,4,5 };
	int arr2[] = { 1,2,3,7,9 };
	int ret=my_memcmp(arr1, arr2, 13);
	printf("%d\n", ret);//这和库函数memcmp所运行的结果是一致的都是-1
	return 0;
}

4.memset (内存设置)

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

#include<stdio.h>
int main()
{
	char arr[] = "hello bit";
	memset(arr,'x', 5);
	printf("%s\n", arr);
	return 0;
}

4.1memset函数的模拟实现

#include<stdio.h>
void* my_memset(void* ptr, int value, size_t num)
{
	void* ret = ptr;
	while (num--)
	{
		(*(char*)ptr) = value;
		((char*)ptr)++;
	}
	return ret;
}
int main()
{
	char arr[] = "hello bit";
	my_memset(arr,'x', 5);
	printf("%s\n", arr);
	return 0;
}

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

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

相关文章

网络统一监控运维管理解决方案(ppt原件方案)

网络统一监控运维管理解决方案 1. 构建完善的网络运维体系&#xff1a;通过组织、流程、制度的完善、支撑手段的建设&#xff0c;构建低成本高效率的IT运营体系&#xff0c;推动IT运营工作自动化、智能化、一体化化发展。 2. 构建网络一体化监控能力&#xff1a;构建从设备、…

YOLOv10 | 无NMS的YOLO | 实时端到端目标检测的新突破

过去几年里&#xff0c;YOLOs因在计算成本和检测性能之间实现有效平衡而成为实时目标检测领域的主流范式。研究人员针对YOLOs的结构设计、优化目标、数据增强策略等进行了深入探索&#xff0c;并取得了显著进展。然而&#xff0c;对非极大值抑制&#xff08;NMS&#xff09;的后…

人工智能的阴暗面:犯罪分子如何利用 AI 进行欺诈

在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;正迅速成为推动各行各业生产力和创新的关键力量&#xff0c;而一些不法分子也开始探索如何将这些先进的工具用于他们自己的非法目的。从网络钓鱼到深度伪造&#xff0c;再到人肉搜索、越狱服务和身份验证系统的…

【无标题】亚马逊5月24日宣布推出2024出口跨境物流加速器计划

亚马逊中国5月24日郑重宣布启动“2024亚马逊出口跨境物流加速器计划”&#xff0c;旨在依托其世界领先的物流网络和前沿技术&#xff0c;结合本土资源&#xff0c;不断优化跨境物流服务&#xff0c;以强化中国卖家在跨境物流供应链管理方面的能力&#xff0c;进而提升整体效率&…

云平台的安全能力提升解决方案

提升云平台的安全能力是确保数据和服务安全的关键步骤。针对大型云平台所面临的云上安全建设问题&#xff0c;安全狗提供完整的一站式云安全解决方案&#xff0c;充分匹配云平台安全管理方的需求和云租户的安全需求。协助大型云平台建设全网安全态势感知、统一风险管理、统一资…

如何从恢复出厂设置的Android手机恢复联系人?

“嗨&#xff0c;先生/女士&#xff0c;我不小心将手机恢复出厂设置&#xff0c;因此所有数据都从我的小米手机中删除。我真的压力很大&#xff01;我什么都试过了&#xff0c;但没有任何效果&#xff01;求求你&#xff0c;帮帮我!!” 由于各种原因&#xff0c;许多人可能已经…

2024年山东省安全员C证证模拟考试题库及山东省安全员C证理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年山东省安全员C证证模拟考试题库及山东省安全员C证理论考试试题是由安全生产模拟考试一点通提供&#xff0c;山东省安全员C证证模拟考试题库是根据山东省安全员C证最新版教材&#xff0c;山东省安全员C证大纲整理…

试用百川智能的百小应-说的太多,做的太少

“百小应”的品牌标识&#xff08;logo&#xff09;上有一缕黄色&#xff0c;这是王小川特意设计的。他说&#xff0c;其他AI应用都在强调科技感&#xff0c;更愿意用蓝色或者冷色调。但他觉得这一代科技与上个时代不一样&#xff0c;现代科技应该像人&#xff0c;所以选择使用…

设计模式9——适配器模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用&#xff0c;主要是下面的UML图可以起到大作用&#xff0c;在你学习过一遍以后可能会遗忘&#xff0c;忘记了不要紧&#xff0c;只要看一眼UML图就能想起来了。同时也请大家多多指教。 适配器模式&#xff08;Adapte…

Transformers实战02-BERT预训练模型微调

文章目录 简介BERT的基本原理分词模型输出 BERT预训练的方法BERT模型微调加载数据集DatasetDataLoader 训练模型构建模型tqdm使用训练模型模型预测 简介 BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;是一种基于 Transformer 模型的预…

Python爬取B站视频:封装一下

&#x1f4da;博客主页&#xff1a;knighthood2001 ✨公众号&#xff1a;认知up吧 &#xff08;目前正在带领大家一起提升认知&#xff0c;感兴趣可以来围观一下&#xff09; &#x1f383;知识星球&#xff1a;【认知up吧|成长|副业】介绍 ❤️如遇文章付费&#xff0c;可先看…

深度学习500问——Chapter09:图像分割(5)

文章目录 9.12 DenseNet 9.13 图像分割的数据集 9.13.1 PASCAL VOC 9.13.2 MS COCO 9.13.3 Cityscapes 9.14 全景分割 9.12 DenseNet 这篇论文是CVPR2017年的最佳论文。 卷积神经网络结构的设计主要朝着两个方向发展&#xff0c;一个是更宽的网络&#xff08;代表&#xff1a…

3D 生成重建011-LucidDreamer 优化SDS过平滑结果的一种探索

3D 生成重建011-LucidDreamer 优化SDS过平滑结果的一种探索 文章目录 0论文工作1论文方法2 效果 0论文工作 文本到3D生成的最新进展标志着生成模型的一个重要里程碑&#xff0c;为在各种现实场景中创建富有想象力的3D资产打开了新的可能性。虽然最近在文本到3D生成方面的进展…

2024 一键批量下载微博内容/图片/视频/评论/转发数据,导出excel和pdf

以李健的微博为例&#xff0c;抓取2010-2024年所有的微博数据excel&#xff0c;包含微博链接&#xff0c;微博内容&#xff0c;发布时间&#xff0c;点赞数&#xff0c;转发数&#xff0c;评论数&#xff0c;话题等。 每个月的微博转评赞总数曲线&#xff0c;2015年是高峰。 微…

Pod进阶——资源限制以及探针检查

目录 一、资源限制 1、资源限制定义&#xff1a; 2、资源限制request和limit资源约束 3、Pod和容器的资源请求和限制 4、官方文档示例 5、CPU资源单位 6、内存资源单位 7、资源限制实例 ①编写yaml资源配置清单 ②释放内存&#xff08;node节点&#xff0c;以node01为…

APP广告变现怎么实现的,背后逻辑是什么?

广告变现的实现主要基于以下几个关键步骤和逻辑&#xff1a; 用户获取与留存&#xff1a;首先&#xff0c;APP需要吸引足够的用户并确保他们的留存率。只有拥有庞大且活跃的用户基础&#xff0c;APP才能吸引广告商投放广告。因此&#xff0c;开发者需要通过优化APP质量、提升用…

阅读笔记——《未知协议状态机推断技术研究综述》

【参考文献】盛嘉杰, 牛胜杰, 陈阳, 等. 未知协议状态机推断技术研究综述[J]. 计算机与现代化, 2023 (05): 58.【注】本文仅为作者个人学习笔记&#xff0c;如有冒犯&#xff0c;请联系作者删除。 摘要 协议逆向工程&#xff08;PRE&#xff09;描述了协议的行为逻辑&#xff…

【Python】—— lambda表达式

目录 &#xff08;一&#xff09;应用场景 &#xff08;二&#xff09;lambda 语法 &#xff08;三&#xff09;示例分析 &#xff08;四&#xff09;lambda参数形式 4.1 无参数 4.2 一个参数 4.3 默认参数 4.4 可变参数 &#xff1a;*args 4.5 可变参数 &#xff1a;…

需求响应+配网重构!含高比例新能源和用户需求响应的配电网重构程序代码!

前言 配电网重构作为配电网优化运行的手段之一&#xff0c;通过改变配电网的拓扑结构&#xff0c;以达到降低网损、改善电压分布、提升系统的可靠性与经济性等目的。近年来&#xff0c;随着全球能源消耗快速增长以及环境的日趋恶化&#xff0c;清洁能源飞速发展&#xff0c;分…

orin部署tensorrt、cuda、cudnn、pytorch

绝大部分参考https://blog.csdn.net/qq_41336087/article/details/129661850 非orin可以参考https://blog.csdn.net/JineD/article/details/131201121 报错显卡驱动安装535没法安装、原始是和l4t-cuda的部分文件冲突 Options marked [*] produce a lot of output - pipe it th…