c语言memcopy_用C语言模拟实现memcpy函数,memmove函数和memset函数

模拟实现memcpy函数:

函数原型:void *memcpy (void *p,void *m, size_t num);

memcpy与strcpy相比,memcpy函数用来做内存拷贝,可以用它拷贝任何数据类型的对象,并且可以指定拷贝的数据长度。stycpy函数也是用来做内存拷贝,并且只能拷贝字符串类型的数据。memcpy并不是遇到"\0"就结束,而是一定会拷贝完num个字节。而strcpy 遇到"\0"就结束。

memcpy函数代码:#include 

#include 

void my_memcpy(void *p,const void *m,size_t num)

{

char *str1 = (char *)p;

const char *str2 = (const char *)m;

assert(p);

assert(m);

while(num)

{

*str1=*str2;

str1++;

str2++;

num--;

}

}

int main()

{

int arr[]={1,2,3,4,5,6,7,8,9};

int i;

my_memcpy(arr,arr+3,sizeof(int)*5);

for(i=0;i<9;i++)

{

printf("%d",arr[i]);

}

return 0;

}

memcpy可以拷贝任何数据类型的对象,比如,上段代码中用memcpy实现了拷贝int 型的数组,用memcpy实现数组的拷贝只能是后面的拷贝前面的,上面代码中从数组的arr+3向arr拷贝,在main函数中存入形参(arr,arr+3,sizeof(int)*5),在调用函数中用void型的指针接收(void *p,const void* m,size_t num),void可以指向任何类型的指针,但是由于复制的时候要一个个字节去复制,所以我们需要把void转换成char类型,然后char类型的两个指针进行拷贝,指针地址加加。

模拟实现memmove函数;

memmove和memcpy函数都是C语言中的库函数,作用是拷贝一定长度的内存的内容,它们的作用是一样的,唯一的区别就是当内存发生局部重叠的时候,memmove保证拷贝的结果是正确的,memcpy不保证拷贝的结果是正确的。

memmove函数代码:#include 

#include 

void my_memmove(void *p,const void *m,size_t num)

{

char *str1 = (char *)p;

const char *str2 = (const char *)m;

assert(p);

assert(m);

if (str1>str2 && str1 

{

while (num--)

{

*(str1+num) = *(str2+num);

}

}

else

{

while(num)

{

*str1=*str2;

str1++;

str2++;

num--;

}

}

}

int main()

{

int arr[]={1,2,3,4,5,6,7,8,9};

int i;

//my_memmove(arr,arr+3,sizeof(int)*5);

my_memmove(arr+3,arr+1,sizeof(int)*5);

for(i=0;i<9;i++)

{

printf("%d",arr[i]);

}

return 0;

}

memmove分两种情况一种是拷贝时内存内部没有发生局部重叠的时候,它的拷贝方式跟memcpy是相同的,另一种是内存内部发生局部重叠时,相当于(str1>str2&&str1

模拟实现memset函数:

函数原型是:void *memset(void *src,int num,size_t len);

memset函数通常用来对一块已经分配地址的内存进行初始化,并且通常初始化为0.#include 

#include 

void my_memset (void *src,int num,size_t len)

{

char *ptr=(char*)src;

while(len--)

{

*ptr=((char*)num);

ptr++;

}

}

int main()

{

int arr[10];

int i;

my_memset(arr,0,5*sizeof(int));

for (i=0;i<10;i++)

{

printf("%d ",arr[i]);

}

return 0;

}

一定需要注意的是,memset是按照字节对初始化空间进行初始化的,也就是说,函数里面的第二个参数的那个初值是按照一个一个字节往第一个参数所指区域赋值的,所以对于单字节数据类型(char)可以初始化为任何值,但对于非但字节数据类型只能初始化为0.

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

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

相关文章

python中oxf2是什么_0x02-StartingPoint-Oopsie

Help Desk经过第一篇文章&#xff0c;我思考了一下&#xff0c;已经存在太多的 walkthrough&#xff0c;不应该再去写一样的文章&#xff0c;而是应该着重写思路。接下来的文章&#xff0c;会着重写在什么情况下&#xff0c;应该做些什么&#xff0c;应该注意哪些信息&#xff…

java jlist checkbox_JCheckBox检查Java中的JList中的切换逻辑时遇到问题

如果我理解这个问题......import java.awt.*;import java.awt.event.*;import javax.swing.*;public class JListToggleLogicTest {private final ClearSelectionListener listener new ClearSelectionListener();public JComponent makeUI() {JList list new JList(makeMode…

java yaml dump方法_yamlyaml.load与yaml.dump方法

yaml.load与yaml.dump方法该模块提供了一些方法&#xff0c;不过常用的方法只有两个yaml.load和yaml.dump &#xff0c;以下是一个版本相关的yaml 格式文件[root361way yaml]# cat tree.yamltreeroot:branch1:name: Node 1branch1-1:name: Node 1-1branch2:name: Node 2branch2…

vba中有多线程吗_VBA会被Python代替吗?

先说答案&#xff1a;不会被替代这里引用轮子哥的话说&#xff1a;微软只会开发更多的增强型插件来慢慢淡化VBA&#xff0c;但是不会用其他语言取代VBA。早在17年底&#xff0c;就有风声说Python要取代VBA&#xff0c;成为Excel官方脚本语言。我认真翻看了下好多篇文章&#xf…

java 编码实现内存拷贝_java提高篇(六)-----使用序列化实现对象的拷贝

我们知道在Java中存在这个接口Cloneable&#xff0c;实现该接口的类都会具备被拷贝的能力&#xff0c;同时拷贝是在内存中进行&#xff0c;在性能方面比我们直接通过new生成对象来的快&#xff0c;特别是在大对象的生成上&#xff0c;使得性能的提升非常明显。然而我们知道拷贝…

统计一个整数的所有因子的个数_【题解循环嵌套】1095:数1的个数

1095&#xff1a;数1的个数时间限制: 1000 ms 内存限制: 65536 KB【题目描述】给定一个十进制正整数n(1≤n≤10000)&#xff0c;写下从1到n的所有整数&#xff0c;然后数一下其中出现的数字“1”的个数。例如当n2时&#xff0c;写下1,2。这样只出现了1个“1”&#xff1b;当…

运行java是提示 选择未包含 main 类型 如何解决_RuoYi 若依 代码生成器使用教程...

你好&#xff01; 若是你想学习如何使用RuoYi 若依 代码生成器, 能够仔细阅读这篇文章&#xff0c;了解一下RuoYi 若依 代码生成器的基本知识。java新建数据表(注意字段必定要写注释)USE ry;web/*Table structure for table sys_zyq */sqlDROP TABLE IF EXISTS sys_zyq;数据库C…

vb.net 功能f8键事件_憋了三年,史上最全的 F1~F12 键用法整理出来了!

F1~F12 键在Excel表格中的用法&#xff0c;小编很早就想写篇教程整理一下。可三年过去了还没整理出来&#xff0c;原因有很多&#xff0c;总结成一个字&#xff1a;懒&#xff01;这么&#xff0c;终于整理出来了&#xff01;提示&#xff1a;有的电脑启用了FN键&#xff0c;如…

java递归分苹果_递归较难题——分苹果问题

第四届程序设计大赛 苹果Time Limit:1000MS Memory Limit:65536KTotal Submit:90 Accepted:48Description把M个同样的苹果放在N个同样的盘子里&#xff0c;允许有的盘子空着不放&#xff0c;问共有多少种不同的分法&#xff1f;(用K表示)5&#xff0c;1&#xff0c;1和1&#…

usb hid 调试软件_开源USB免驱固件升级软件分享

跳兔科技开源软件分享&#xff0c;免驱的USB固件升级软件&#xff0c;给您的产品提供无限的活力。加快产品上市速度。相信做MCU开发的人都免不了要做boot升级功能&#xff0c;产品投入使用中&#xff0c;如果再使用link进行固件更新的话就比较麻烦&#xff0c;那么拥有一个优秀…

java地址自动拆分_java – Hibernate:每个月自动拆分表

我正在研究一个带有Postgresql和Hibernate的Spring-MVC应用程序,其中我有几个表,行数超过10万(10万).这些表,我95&#xff05;的时间只访问最新的数据,并筛选所有这些行是耗时的.很多时候查询规划器甚至没有使用索引(原因我不知道).然后我想到每周拆分数据库表,所以我们可以先访…

yolo算法_不到2MB,超轻YOLO算法!准确率接近YOLOv3,速度快上45%

点击上方↑↑↑“OpenCV学堂”关注我来源&#xff1a;公众号 量子位 授权最轻的YOLO算法出来了&#xff01;这是个模型非常小、号称目前最快的YOLO算法——大小只有1.3MB&#xff0c;单核每秒148帧&#xff0c;移动设备上也能轻易部署。而且&#xff0c;这个YOLO-Fastest算法满…

mysql报错last packet_mysql The last packet successfully received

mysql服务器最近老是报错&#xff0c;内容如下&#xff1a;The last packet successfully received from the server was 65,502,275 milliseconds ago. The last packet sent successfully to the server was 65,502,276 milliseconds ago. is longer than the server configu…

http请求丢部分数据_温故知新,HTTP/2

去年年底&#xff0c;据国际互联网工程任务组( IETF )消息&#xff0c;HTTP-over-QUIC 实验性协议将被重命名为 HTTP/3&#xff0c;即有望成为 HTTP 协议的第三个正式版本&#xff0c;也就是说HTTP/3可能要来了。 该消息是如此的惹人注目&#xff0c;是因为HTTP是我们身边的协议…

poi java 其他_让POI架起Java与Office之间的桥梁一

本文将阐述如何用POI来读取/写入完整的Excel文件。作者&#xff1a;中国IT实验室 来源&#xff1a;中国IT实验室 2007年8月31日本文将阐述如何用POI来读取/写入完整的Excel文件。约定&#xff1a;POI项目2.0版现在已经接近正式发行阶段&#xff0c;开发进度迅速&#xff0c;不断…

vue ui框架_「webAPP」记录几款比较好用的vue 移动端的ui框架

有时在做项目时&#xff0c;不同场景的项目既要有网站&#xff0c;又要有手机端&#xff0c;为了快速开发&#xff0c;如果功能简单&#xff0c;要求不高的话&#xff0c;我们一般会用H5进行移动端的适配。如果采用纯html进行书写手机端的样式&#xff0c;往往UI的体验感非常差…

java定义基础变量语句_编程语言第一:JAVA语言基础,变量

在前面的几篇文章中我们介绍了Java的运行环境&#xff0c;以及Eclipse IDE的安装与使用。从今天开始我们的文章开始介绍Java开发语言的基础知识。今天主要介绍Java变量。一、什么是变量变量是指代在内存中开辟的存储空间&#xff0c;用于存放运算过程中需要用到的数据。例&…

python keras_深度学习:基于Keras的Python实践

部分初识1初识深度学习/21.1Python的深度学习/21.2软件环境和基本要求/31.2.1Python和SciPy/31.2.2机器学习/31.2.3深度学习/41.3阅读本书的收获/41.4本书说明/41.5本书中的代码/52深度学习生态圈/62.1CNTK/62.1.1安装CNTK/72.1.2CNTK的简单例子/82.2TensorFlow/8部分初识1初识…

php 模拟并发请求_PHP模拟并发请求

原理&#xff1a;使用curl_init()创建多个请求实例&#xff0c;再使用curl_multi_init()批量执行创建的多个请求实例。文件1&#xff1a;curl.php<?php $threads500;//并发请求次数$urlhttp://blog.cn/index.php?;//请求的url//创建一个未定义的curl句柄数组$charray();//…

spring.profiles.active配置了没生效_微服务架构之「 配置中心 」

在微服务架构的系列文章中&#xff0c;前面已经通过文章《微服务架构之「服务网关 」》介绍过了在微服务中服务网关的原理和应用&#xff0c;今天这篇文章我们继续来聊一聊微服务中另外一个重要模块&#xff1a;「 配置中心 」。后面还会继续介绍 服务框架、服务监控、服务治理…