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 个元素到 destmemcpy(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;
}

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

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

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

相关文章

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

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

【JVM】(内存区域划分 为什么要划分 具体如何分 类加载机制 类加载基本流程 双亲委派模型 类加载器 垃圾回收机制(GC))

文章目录 内存区域划分为什么要划分具体如何分 类加载机制类加载基本流程双亲委派模型类加载器 垃圾回收机制&#xff08;GC&#xff09; 内存区域划分 为什么要划分 JVM启动的时候会申请到一整个很大的内存区域,JVM是一个应用程序,要从操作系统这里申请内存,JVM就需要根据,把…

【Leetcode-73.矩阵置零】

题目&#xff1a; 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]]示例 2&…

如何写好Stable Diffusion的prompt

Stable Diffusion是一种强大的文本到图像生成模型&#xff0c;其效果在很大程度上取决于输入的提示词&#xff08;Prompt&#xff09;。以下是一些关于如何编写有效的Stable Diffusion Prompt的秘诀&#xff1a; 明确描述&#xff1a;尽量清晰地描述你想要的图像内容。使用具体…

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

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

Linux_基础指令(一)

目录 1、ls指令 1.1 ls -l 1.2 ls -a 1.3 ls -i 2、pwd指令 3、cd指令 3.1 路径的概念 3.1.1 绝对路径 3.1.2 相对路径 3.2 cd ~ 3.3 cd - 4、touch指令 5、mkdir指令 6、删除系列的指指令 6.1 rmdir 6.2 rm 7、man指令 8、cp指令 9、move指令 结…

【Java】十大排序

目录 冒泡排序 选择排序 插入排序 希尔排序 归并排序 快速排序 堆排序 计数排序 桶排序 基数排序 冒泡排序 冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地遍历要排序的序列&#xff0c;依次比较两个元素&#xff0c;如果它们的顺序错误就把它们交换过来。遍历…

论文阅读_参数微调_P-tuning_v2

1 P-Tuning PLAINTEXT 1 2 3 4 5 6 7英文名称: GPT Understands, Too 中文名称: GPT也懂 链接: https://arxiv.org/abs/2103.10385 作者: Xiao Liu, Yanan Zheng, Zhengxiao Du, Ming Ding, Yujie Qian, Zhilin Yang, Jie Tang 机构: 清华大学, 麻省理工学院 日期: 2021-03-18…

东京旅行攻略:机票、交通、消费和看富士山

欢迎关注「苏南下」 在这里分享我的旅行和影像创作心得 分享一些最近从香港去日本东京的短期周末旅行体验。 1&#xff1a;香港飞东京需要4小时&#xff0c;非旺季往返的价格在2000元左右。去年五一假期&#xff0c;我提前了两个多月买的香港快运就是这个价&#xff0c;不算贵。…

微信小程序的页面制作---常用组件及其属性

微信小程序里的组件就是html里的标签&#xff0c;但其组件都自带UI风格和特定的功能效果 一、常用组件 view&#xff08;视图容器&#xff09;、text&#xff08;文本&#xff09;、button&#xff08;按钮&#xff09;、image&#xff08;图片&#xff09;、form&#xff08…

Sentinel篇:线程隔离和熔断降级

书接上回&#xff1a;微服务&#xff1a;Sentinel篇 3. 隔离和降级 限流是一种预防措施&#xff0c;虽然限流可以尽量避免因高并发而引起的服务故障&#xff0c;但服务还会因为其它原因而故障。 而要将这些故障控制在一定范围&#xff0c;避免雪崩&#xff0c;就要靠线程隔离…

【Visual Studio】VS转换文件为UTF8格式

使用高级保存选项 更改VS的编码方案 首先需要打开高级保存选项 然后打开 文件 —> 高级保存选项 即可进行设置

OSPF协议全面学习笔记

作者&#xff1a;BSXY_19计科_陈永跃 BSXY_信息学院 注&#xff1a;未经允许禁止转发任何内容 OSPF协议全面学习笔记 1、OSPF基础2、DR与BDR3、OSPF多区域4、虚链路Vlink5、OSPF报文6、LSA结构1、一类/二类LSA&#xff08;Router-LSA/Network-LSA&#xff09; 更新完善中... 1、…

ChatGPT :确定性AI源自于确定性数据

ChatGPT 幻觉 大模型实际应用落地过程中&#xff0c;会遇到幻觉&#xff08;Hallucination&#xff09;问题。对于语言模型而言&#xff0c;当生成的文本语法正确流畅&#xff0c;但不遵循原文&#xff08;Faithfulness&#xff09;&#xff0c;或不符合事实&#xff08;Factua…

C++——string

一学习string的原因 1.从个人理解角度上&#xff1a; 在刚开始学习之前&#xff0c;我只知道学习完string在以后的刷题中能提高做题效率&#xff0c;在对字符串的处理string库中也许有对应的接口去实现需求&#xff0c;不用自己去写函数的实现。 但在学string中改变了之前的…

【PyTorch】基础学习:一文详细介绍 torch.save() 的用法和应用

【PyTorch】基础学习&#xff1a;一文详细介绍 torch.save() 的用法和应用 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f44…

Flask中的Blueprints:模块化和组织大型Web应用【第142篇—Web应用】

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 Flask中的Blueprints&#xff1a;模块化和组织大型Web应用 在构建大型Web应用时&#xff0…

最后的挣扎 - Qt For Android on HuaWei Mate 60Pro (v4.0.0)

简介 为什么叫最后的挣扎, 其实都知道即将到来的 HarmonyOS NEXT 将抛弃Android支持&#xff0c;纯血HarmonyOS 将上线&#xff0c; 此时再说Qt for android支持Huawei HarmonyOS的设备其实并没有多少意思&#xff0c; 但恐怕在大多数基础软件完成兼容前&#xff0c; 很多人还是…

【PyTorch】基础学习:一文详细介绍 torch.load() 的用法和应用

【PyTorch】基础学习&#xff1a;一文详细介绍 torch.load() 的用法和应用 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f44…

UCORE 清华大学os实验 lab0 环境配置

打卡 lab 0 &#xff1a; 环境配置 &#xff1a; 首先在ubt 上的环境&#xff0c;可以用虚拟机或者直接在windows 上面配置 然后需要很多工具 如 qemu gdb cmake git 就是中间犯了错误&#xff0c;误以为下载的安装包&#xff0c;一直解压不掉&#xff0c;结果用gpt 检查 结…