C语言-memcpy(不重复地址拷贝 模拟实现)

memcpy(不重复地址拷贝)

语法格式

在C语言中,`memcpy` 是一个标准库函数,用于在内存之间复制数据。它的原型定义在 `<string.h>` 头文件中。`memcpy` 的语法格式如下:

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


参数说明:
- `destination`: 指向目标内存块的指针,即将要复制数据到的位置。
- `source`: 指向源内存块的指针,即数据的起始位置。
- `num`: 要复制的字节数。
`memcpy` 函数会从 `source` 指向的内存位置开始,复制 `num` 个字节到 `destination` 指向的内存位置。请注意,`memcpy` 不会检查目标内存是否足够大以容纳要复制的数据,这可能会导致未定义行为,如内存越界。
示例用法:

```c
#include <stdio.h>
#include <string.h>
int main() {
    int src[] = {1, 2, 3, 4, 5};
    int dest[10];
    // 复制数组 src 的前 5 个元素到 dest
    memcpy(dest, src, 5 * sizeof(int));
    // 打印结果
    for (int i = 0; i < 5; i++) {
        printf("%d ", dest[i]);
    }
    printf("\n");
    return 0;
}

在这个例子中,`memcpy` 被用来复制 `src` 数组的前 5 个元素到 `dest` 数组中。 

具体说明

memcpy这个是拷贝内存快 什么都能拷贝

函数的返回类型是void*

void*类型也就说明 计算的时候是需要强制类型转化的 因为void的类型是无法计算的

使用规则 num 拷贝长度 这里是长度的大小是字节的大小,因为是地址的拷贝,也就是有可能是拷贝字符,这样的情况下只能是拷贝一个字节一个字节拷贝的情况下才能完成。

这里arr1 和arr2不要有内存的重叠

函数的模拟实现

src源头

num长度

这里不能写成int* 因为int*也就是说明类型固定

所以只能是void*(这里针对各种类型的类型)这里可以加上const

这里说明返回目标空间的起始地址

图解

这里是20个字节 这个数组是20个元素 80个字节 不能理解错了 这个数组不是20个字节

这里还是一个字节一个字节的拷贝

20个字节传递5个元素

这里使用char*指类型的指针解应用是最好的选择

也就这里是一个字节一个字节的交换 相当于strstr

完整代码

这里强制类型转化是不行的 因为强制类型转化是临时的

除非这样

版本2

这里说明 已经放1 2 了此时3 准备放到5的时候 此时 3 本身的位置变成1 所以也就是1 2 1 2 1 2 1 8 9 10

这里可以加上const 在source里面 因为source是被拷贝的地址 我们是不希望进行改变的

代码总结 

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<assert.h>
void* my_memcpy(void* dest, void* src, size_t num)
{
	assert(dest && src);
	while (num--)
	{
		*(char*)dest = *(char*)src;//void类型是不能进行计算的 只能进行强制类型转化 要转化成char*类型的原因是 一方面这个是指针 另一方面这个是按照字节大小进行计算拷贝的
		dest = (char*)dest + 1;
		src = (char*)src + 1;//或者写成这样 这里强制类型转化的情况下  
		//src=((char*)(src))++;这样的话可以++
	}
}

void* MY_memcpy(void* str1, void* str2, size_t num)
{
	assert(str1 && str2);
	while (num--)//这里是每次计算的时候减少一个字节 所以会直到为0 的时候自己跳出循环
	{
		*(char*)str1 = *(char*)str2;//进行强制类型转化的原因是因为这里是void类型 void类型是无法参与计算的 所以要进行强制类型转化
		str1 = (char*)str1 + 1;//这里不能和拷贝库函数一样直接++ 因为void是无法参与计算的 
		str2 = (char*)str2 + 1;
	}

}
int main()
{
	char arr1[] = "sdfhilbgjju ";
	char arr3[100] = { 0 };
	memcpy(arr3, arr1, 20);//这里是拷贝空间和被拷贝空间 num是字节大小 不是
	printf("%s \n", arr3);


	int arr2[] = { 1,2,3,4,5,6,7,8,9 };
	int arr4[100] = { 0 };
	memcpy(arr4, arr2, 20);
	for (int i = 0; i < 20; i++)
	{
		printf("%d ", arr4[i]);
	}
	printf("\n");


	//模拟memcpy函数
	int arr5[] = { 1,2,3,4,5,6,7,8,9 };
	int arr6[100] = { 0 };
	my_memcpy(arr6, arr5, 20);
	for (int i = 0; i < 20; i++)//这里的20 不是二十字节 而是二十个数值
	{
		printf("%d ", arr6[i]);//这里是直接打印数组
	}
	printf("\n");


	//二次模拟memcpy函数
	int str1[] = { 1,2,3,4,5,6,7,8,9 };
	int str2[100] = { 0 };
	MY_memcpy(str2, str1, 20);
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", str2[i]);
	}

	return 0;
}

————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

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

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

相关文章

2024全新返佣商城分销商城理财商城系统源码 全开源PHP+VUE源码

2023全新返佣商城分销商城理财商城系统源码 全开源PHPVUE源码 程序安装环境要求&#xff1a; nginx1.16 php7.2 mysql5.6 程序全开源PHPVUE源码 有需要测试的老铁&#xff0c;拿去测试吧

KKVIEW远程: 安卓免费远程控制软件

安卓免费远程控制软件&#xff1a;方便、实用且高效 在数字化日益增长的今天&#xff0c;远程控制软件正变得越来越重要。无论是在家庭环境还是工作环境中&#xff0c;它们都能为我们提供便利。特别是在移动设备上&#xff0c;如安卓设备&#xff0c;这种需求更为明显。幸运的是…

基于高斯模型的运动目标检测(车辆检测),Matlab实现

博主简介&#xff1a; 专注、专一于Matlab图像处理学习、交流&#xff0c;matlab图像代码代做/项目合作可以联系&#xff08;QQ:3249726188&#xff09; 个人主页&#xff1a;Matlab_ImagePro-CSDN博客 原则&#xff1a;代码均由本人编写完成&#xff0c;非中介&#xff0c;提供…

RTC协议与算法基础 - RTP/RTCP

首先&#xff0c;需要说明下&#xff0c;webrtc的核心音视频传输是通过RTP/RTCP协议实现的&#xff0c;源码位于src/modules/rtp_rtcp目录下&#xff1a; 下面让我们对相关的内容基础进行简要分析与说明&#xff1a; 一、TCP与UDP协议 1.1、TCP协议 TCP为了实现数据传输的可…

C到C++的敲门砖-2

文章目录 引用内联函数auto关键字基于范围的for循环指针空值nullptr后记 引用 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空 间&#xff0c;它和它引用的变量共用同一块内存空间。 所谓引用就是给变量起别名&am…

uwsgi+nginx+django 部署学习

收集静态文件及部署配置 DEBUG False STATICFILES_DIRS [os.path.join(BASE_DIR, "static"), ] STATIC_ROOT /data/static python3 manage.py collectstatic 收集静态文件&#xff0c;成功后可在STATIC_ROOT目录查看 安装依赖 pip3 install uwsgi django项目结…

浅谈如何自我实现一个消息队列服务器(1)——需求分析

文章目录 一、什么是消息队列&#xff1f;二、当下主流的消息队列(MQ)三、自我实现一个消息队列服务器的前期准备——需求分析3.1 核心概念3.2 broker server 核心概念3.2.1、虚拟主机&#xff08;Virtual Host&#xff09;3.2.2、交换机&#xff08;Exchange&#xff09;3.2.2…

Apache-Doris基础概念

OLAP数据库Doris 一、Doris架构二、基本概念1. Row & Column2. Partition & Tablet3. 建表示例&#xff08;1&#xff09;列的定义&#xff08;2&#xff09;分区分桶&#xff08;3&#xff09;多列分区&#xff08;4&#xff09;PROPERTIES&#xff08;5&#xff09;E…

stable diffusion webui 搭建和初步使用

官方repo: GitHub - AUTOMATIC1111/stable-diffusion-webui: Stable Diffusion web UI 关于stable-diffusion的介绍&#xff1a;Stable Diffusion&#xff5c;图解稳定扩散原理 - 知乎 一、环境搭建和启动 准备在容器里面搞一下 以 ubuntu22.04 为基础镜像&#xff0c;新建…

健身·健康行业Web3新尝试:MATCHI

随着区块链技术进入主流&#xff0c;web3 运动已经开始彻底改变互联网&#xff0c;改写从游戏到金融再到艺术的行业规则。现在&#xff0c;MATCHI的使命是颠覆健身行业。 MATCHI是全球首个基于Web3的在线舞蹈健身游戏和全球首个Web3舞蹈游戏的发起者&#xff0c;注册于新加坡&a…

保研|资讯|夏令营|3.31截止!香港城市大学市场营销学系首届学术暑期夏令营

香港城市大学市场营销学系首届学术暑期夏令营 1 项目简介 我们的博士项目致力为未来营销科学和工商管理学界培养一流学者和行业领袖。博士项目一般为期四到六年&#xff0c;允许本科生直接申请。课程包括实证分析模型&#xff0c;消费者行为研究&#xff0c;博弈微观模型&…

龙芯新世界系统(安同AOCS OS)安装Cinnamon桌面最新版6.0.4

龙芯的新世界系统安同AOCS OS是十分优秀的操作系统&#xff0c;处于纯社区方式运行&#xff0c;她的各组件更新得很及时&#xff0c;很多组件都处于最新的状态&#xff0c;给我们安装使用最新的开源软件提供了很好的基础。由于本人一直使用Cinnamon桌面环境&#xff0c;各方面都…

Docker 哲学 - 容器操作 (二)

命令行启动 参数键值之间可以使 " " 或者 空格 卷的挂载是在容器创建时指定的&#xff0c;不能在容器运行时再添加 当加上 --network-alias 设置同一网络下别名参数后 &#xff0c;inspect 该容器发现 会同步到 容器信息中 2、给容器打日志 docker logs 【-…

【数据结构】栈与队列

一、栈 1.基本概念 栈是只能在一段进行插入或者删除的线性表 出栈进栈 只能在栈顶进行 三个术语&#xff1a;栈底&#xff0c;空栈&#xff0c;栈顶 字面理解即可 栈的基本操作&#xff1a; 创 销 增 删 查 2.顺序栈的实现 &#xff08;1&#xff09;初始化 #define…

玩转C语言——数组初探

一、前言 通过前面的学习&#xff0c;我们已了解C语言的结构变量、分支结构和循环结构。今天&#xff0c;我们一起来认识C语言的另一知识点——数组。先赞后看&#xff0c;养成习惯。 二、数组概念 学习数组&#xff0c;我们要明白数组是什么。在我看来&#xff1a;数组是⼀组…

Linux提权!!

本来是想更新PTH的&#xff0c;但我鸽了&#xff0c;那就来讲讲Linux的提权吧&#xff01;&#xff01;主要是下周我就要学免杀了啦&#xff01;&#xff01;&#xff01; 对于内网&#xff0c;什么难学&#xff1f;&#xff1f;&#xff1f; 是的&#xff0c;确实呢&#xff0…

ISIS默认层级实验简述

ISIS被划分为三个层级&#xff1a;Level 1、Level 2和Level 1-2。 默认情况下&#xff0c;ISIS路由器属于level 1-2,是指同时支持Level 1和Level 2的路由器。路由器既可以在同一个自治系统内部进行路由选择&#xff0c;也可以将路由信息传递到其他自治系统。 实验拓扑图&#…

Redis实战——优惠券秒杀:超卖问题一人一单问题

目录 优惠券秒杀Redis实现全局唯一ID业务场景代码实现&#xff1a; 添加优惠券业务场景新增普通券新增秒杀券测试添加秒杀券 实现秒杀下单业务分析流程代码编写 超卖问题超买场景分析解决方案使用乐观锁 一人一单业务场景解决步骤 集群环境下的并发问题 优惠券秒杀 Redis实现全…

AntV L7深圳智慧城市

本案例使用L7库和Mapbox GL JS构建深圳智慧城市。 文章目录 1. 引入 CDN 链接2. 引入组件3. 创建地图4. 创建场景5. 获取数据6. 创建面图层7. 演示效果8. 代码实现 1. 引入 CDN 链接 <!-- 1.引入CDN链接 --> <script src"https://unpkg.com/antv/l7"><…

Transformer的前世今生 day02(神经网络语言模型

神经网络语言模型 使用神经网络的方法&#xff0c;去完成语言模型的两个问题&#xff0c;下图为两层感知机的神经网络语言模型&#xff1a; 以下为预备概念 感知机 线性模型可以用下图来表示&#xff1a;输入经过线性层得到输出 线性层 / 全连接层 / 稠密层&#xff1a;假…