四个内存函数

news2024/9/27 17:34:21

文章目录

  • memcpy函数(拷贝)
  • 模拟实现memcpy函数
  • memcpy的升级
  • memmove

之前的拷贝或赋值等都是对字符串操作的,而对内存中其它数据如结构体,数组中的数据的拷贝,都是要用内存函数来完成的。

memcpy函数(拷贝)

在这里插入图片描述
第一个参数为目标地址,第二个参数是源地址,第三个参数是要拷贝的字节大小。
这个函数拷贝相对于strcpy函数来说不仅限于对字符串的拷贝。

#include<string.h>

int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9 };
	int arr2[10] = { 0 };
	memcpy(arr2, arr1,20);
}

模拟实现memcpy函数

#include <stdio.h>

void my_memcpy(void* dest, const void* src, size_t num)//为什么参数类型是void?
{
	while (num--)
	{
		*(char*)dest = *(char*)src;//为什么要强转为char指针类型?
		dest = (char*)dest + 1;//为什么(char*)dest++是错误的?
		src = (char*)src + 1;
	}
	
}
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9 };
	int arr2[10] = { 0 };
	my_memcpy(arr2, arr1, 20);
	return 0;
}

以上模拟的memcpy当在拷贝自身数值时可能会出错
拷贝自身时有三种情况一种是源地址在目标地址的后面,一种是源地址和目标地址位置相同,一种是源地址在目标地址的前面
我们可以将它分为两种情况一种是源地址在目标地址前面时我们按照从前向后拷贝,一种是源地址在目标地址后面或相同时我们按照从后向前拷贝,为的是避免在拷贝过程中有的数据被覆盖掉。

memcpy的升级

#include <stdio.h>

void my_memcpy(void* dest, const void* src, size_t num)//为什么参数类型是void?
{
  void* ret = dest;
	if (src >= dest)
	{
		//从前向后拷贝
		while (num--)
		{
			*(char*)dest = *(char*)src;//为什么要强转为char指针类型?
			dest = (char*)dest + 1;//为什么(char*)dest++是错误的?
			src = (char*)src + 1;
		}
	}
	else
	{
		//从后向前拷贝
		while (num--)
		{
			/**(char*)dest + num = *(char*)src + num;*///这样写是错误的
			*((char*)dest + num) = *((char*)src + num);
		}
	}
  return ret;
}

不同编译器拷贝的结果不同,所以对自身进行拷贝时尽量使用memmove函数来进行拷贝

memmove

在这里插入图片描述

第一个参数为目标地址,第二个参数是源地址,第三个参数是要拷贝的字节大小。

memmove可以实现重叠内存的拷贝
#include<string.h>

int main()
{
	int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[10] = { 1,2,3,4,5,6,7,8,9,10 };
	memmove(arr1 + 2, arr1, 20);
	memmove(arr2, arr2 + 2, 20);
	return 0;
}

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

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

相关文章

SMART PLC飞剪控制算法

如何通过编码器计算材料输送长度和速度,这里其实是属于计米和测速应用,在专栏里有详细介绍大家可以自行搜索,常用链接如下: 【精选】如何通过编码器信号计算输送线/输送带线速度(飞剪、追剪算法基础)_追剪控制算法-CSDN博客文章浏览阅读2.3k次。不同品牌PLC如何采集编码…

shell脚本实战案例--系统服务脚本

目录 1、源码编译安装nginx 2、分别编写基于RHEL6和RHEL7的脚本。 2.1 RHEL6的nginx系统服务脚本 2.2 RHEL7的nginx系统服务脚本 1、源码编译安装nginx 1.首先关闭防火墙和selinux [rootnode13 ~]# systemctl stop firewalld [rootnode13 ~]# setenforce 0 2.准备环境&…

【C++】STL容器——string类的例题应用(9)

前言 大家好吖&#xff0c;欢迎来到 YY 滴C系列 &#xff0c;热烈欢迎&#xff01;本章主要内容面向接触过C的老铁&#xff0c;下面是收纳的一些例题与解析~ 主要内容含&#xff1a; 欢迎订阅 YY 滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; 目…

k8s-----17、集群安全机制

1、集群安全机制概述 1.1 访问k8s的三个步骤 1、认证 2、鉴权(授权) 3、准入控制 进行访问的时候&#xff0c;过程中都需要经过apiserver&#xff0c;apiserver做统一协调&#xff0c;比如门卫。且访问过程中需要证书、token、或者用户名密码。如果需要访问pod&#xff0c;…

xshell+xming显示jmeter的gui页面

1.下载和安装xming&#xff0c;下载地址&#xff1a;https://sourceforge.net/projects/xming/ 2.配置xming 记住这个端口&#xff0c;一会要用到 修改进入xming安装目录修改host文件 此处是远程服务器的ip 3.服务器执行vi /etc/ssh/sshd_config&#xff0c;修改成如图所示…

C++入门(命名空间、缺省参数、引用、函数重载、内联函数)

目录 命名空间介绍命名空间格式命名空间使用 C输入输出缺省参数全缺省参数半缺省参数 函数重载引用引用特性常引用引用和指针的区别 内联函数 1024程序员节快乐&#xff01;&#xff01;&#xff01;&#x1f380;&#x1f381;&#x1f389; 命名空间介绍 在C/C中&#xff0c…

电子表格text函数学习

text函数用于格式化内容&#xff1b;函数格式是 text(要格式化的值, 格式)&#xff1b; B4有内容为 2020/3/15 &#xff1b;输入下图&#xff1b; 把B4内容格式化为下图的年月日形式&#xff1b;B11有数值4.5&#xff0c;输入下图的格式化函数&#xff0c; 结果是四舍五入取整…

Cisco IOS XE Web UI 命令执行漏洞

Cisco IOS XE Web UI 命令执行漏洞 受影响版本 Cisco IOS XE全版本 漏洞描述 Cisco IOS XE Web UI 是一种基于GUI的嵌入式系统管理工具&#xff0c;能够提供系统配置、简化系统部署和可管理性以及增强用户体验。它带有默认映像&#xff0c;因此无需在系统上启用任何内容或安…

Lua语言编写爬虫程序

以下是一个使用luasocket-http库和Lua语言编写的爬虫程序。此程序使用了https://www.duoip.cn/get_proxy的代码。 -- 引入所需的库 local http require("socket.http") local ltn12 require("ltn12") local json require("json") ​ -- 获取…

ARM,汇编指令

一、汇编指令 1、搬移指令 mov r0 ,#3 mov r1,r0 msr cpsr,r0 mrs r0,cpsr 2、条件执行及标志位 cmp moveq movgt 3、机器码 1&#xff09;、立即数合法性 2&#xff09;、立即数不合法 ldr r0,0x12345678 伪指令解决不合法的问题 前4位表示16个数&#xff0c;一个数移动2次。 …

安装MariaDB数据库安装(离线安装)

参考地址: https://mirror.mariadb.org/yum/10.4/centos7-amd64/rpms/ http://www.gxcode.top/code 4.1 安装mariadb环境需要的依赖 # yum install rsync nmap lsof perl-DBI nc 4.2 安装MariaDB依赖包 # rpm -ivh jemalloc-3.6.0-1.el7.x86_64.rpm # rpm -ivh jemalloc…

图和图神经网络的可视化,详解与示例

1 图和图神经网络可视化 图和图神经网络&#xff08;Graph Neural Networks&#xff0c;GNNs&#xff09;的可视化对于理解和分析复杂图结构和模型的工作非常重要。图和图神经网络&#xff08;GNN&#xff09;的可视化是一种强大的工具&#xff0c;用于理解和分析复杂的图结构…

B-3:Web安全之综合渗透测试

B-3:Web安全之综合渗透测试 任务环境说明: 服务器场景:Server2104(关闭链接) 服务器场景用户名、密码:未知 1.通过URL访问http://靶机IP/1,对该页面进行渗透测试,将完成后返回的结果内容作为FLAG值提交; 通过访问IP/1,查看源代码发现flagishere,访问后发现什么也没…

webpack中常见的Loader解决了什么问题?

一、是什么 loader 用于对模块的"源代码"进行转换&#xff0c;在 import 或"加载"模块时预处理文件 webpack做的事情&#xff0c;仅仅是分析出各种模块的依赖关系&#xff0c;然后形成资源列表&#xff0c;最终打包生成到指定的文件中。如下图所示&#…

2017年亚太杯APMCM数学建模大赛A题睡眠对人体的影响求解全过程文档及程序

2017年亚太杯APMCM数学建模大赛 A题 睡眠对人体的影响 原题再现 自2001年以来&#xff0c;世界睡眠医学协会将每年的3月21日定为世界睡眠日&#xff0c;以引起人们对睡眠的重要性和质量的关注。 一整天的精神状态取决于昨晚的睡眠质量&#xff0c;高睡眠质量自然保证了人们精…

C++面试常见问题多态如何实现?虚函数的底层如何实现?

1.黑马程序员多态例子 class Animal { public://Speak函数就是虚函数//函数前面加上virtual关键字&#xff0c;变成虚函数&#xff0c;那么编译器在编译的时候就不能确定函数调用了。virtual void speak(){cout << "动物在说话" << endl;} };class Cat …

Jetpack:016-Jetpack中的SanckBar

文章目录 1. 概念介绍2. 使用方法2.1 显示内容2.2 显示方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了Jetpack相关的概念和主要内容&#xff0c;本章回中主要介绍 SnackBar。闲话休提&#xff0c;让我们一起Talk Android Jetpack吧&#xff01; 1. 概念介绍 我们在本章…

【J-Long Group Limited】申请1500万美元纳斯达克IPO上市

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经获悉&#xff0c;总部位于中国香港的J-Long Group Limited&#xff08;简称&#xff1a;J-Long&#xff09;近期已向美国证券交易委员会&#xff08;SEC&#xff09;提交招股书&#xff0c;申请在纳斯达克IPO上市&…

C语言 每日一题 PTA 10.21-10.24日 day3

1.计算分段函数[1] 本题目要求计算下列分段函数f(x)的值&#xff1a; yf(x)1/x x!0 yf(x)0 x0 int main() {double num 0;scanf("%lf", &num);double result 0;if (num 0){result 0;}else{result 1 / num;}printf("f(%.1lf)%.1lf", num, result)…

获取Android签名文件的MD5和SHA1指纹

以前在App中集成百度地图时&#xff0c;需要在百度地图的开发者网站上绑定应用的包名和签名&#xff0c;以预防自己的key被别人乱用。 最近公司的一个球机产品也搞了类似的做法&#xff0c;我们要访问它的摄像头功能需要使用厂家提供的aar库&#xff0c;但是你要想正常调用它的…