库函数memcpy的实现

2023-05-16

1.先看一下memcpy的声明

  从str2所指向的内容的n个字节复制到str1所指向的内容中,注意这里是n个字节,后面实现该库函数时我会详细解释.size_t你们可以查一下它的定义,代表着无符号整型.

2.好,来看看我们如何实现它

void* my_memcpy(void* dest,const void* src, size_t num)
{
	void* ret = dest;
	assert(dest);
	assert(src);
	//有多少个字节执行多少次
	while (num--)
	{
		//一个字节一个字节进行赋值
		*(char*)dest = *(char*)src;
		++(char*)dest;
		++(char*)src;
	}
	return ret;
}

  这里你应该要产生一种疑问,为什么我们实现该库函数时,它的参数类型为什么要这样设置,难道就是简单地模仿?其实当你用这个库函数时,你会发现,它不仅可以实现数组之间的拷贝,字符串之间的拷贝,结构体数组的拷贝......你想想实现它要接受多少不同类型的地址(是整型的还是字符型的还是其它),所以我们在参数中用到了void *,因为它可接受任何类型的地址。好,这个问题解决了,又有一个问题来了,怎样去实现拷贝?

  我们知道不同的数据类型,它所占的空间大小也不一样,所以(这里我直接说,后面会有具体实现的效果,好好去看一下那几个例子)我们一个字节一个字节地拷贝,化大为小,每块个小的一样,大的也就一样了.

3.例子1

void* my_memcpy(void* dest,const void* src, size_t num)
{
	void* ret = dest;
	assert(dest);
	assert(src);
	//有多少个字节执行多少次
	while (num--)
	{
		//只有强制转化为char*才可以实现一个字节一个字节进行赋值另外(void*)不能直接解引用
		*(char*)dest = *(char*)src;
		++(char*)dest;
		++(char*)src;
	}
	return ret;
}
int main()
{
	int arr1[] = { 1,2,3,4,5 };
	int arr2[5] = { 0 };
	//将数组arr1的内容拷贝到arr2数组中,arr1数组大小为20个字节所以执行我们的函数20次
	my_memcpy(arr2, arr1, sizeof(arr1));
	//打印数组arr2
	for (int i = 0; i < 5; i++)
	{
		printf("%d ", arr2[i]);
	}
}

3.1例子2

void* my_memcpy(void* dest,const void* src, size_t num)
{
	void* ret = dest;
	assert(dest);
	assert(src);
	//有多少个字节执行多少次
	while (num--)
	{
		//只有强制转化为char*才可以实现一个字节一个字节进行赋值另外(void*)不能直接解引用
		*(char*)dest = *(char*)src;
		++(char*)dest;
		++(char*)src;
	}
	return ret;
}
int main()
{
	char arr1[] = "abcde";
    char arr2[10] = "hahahs";
    char* ret = (char*)my_memcpy(arr2, arr1, sizeof(arr1) - 1);
	//返回了字符串首地址这就是void* ret = dest的作用
    printf("%s\n", ret);
}

3.1例子3

#include <assert.h>
struct s
{
	int age;
	char name[20];
};
void* my_memcpy(void* dest,const void* src, size_t num)
{
	void* ret = dest;
	assert(dest);
	assert(src);
	//有多少个字节执行多少次
	while (num--)
	{
		//只有强制转化为char*才可以实现一个字节一个字节进行赋值另外(void*)不能直接解引用
		*(char*)dest = *(char*)src;
		++(char*)dest;
		++(char*)src;
	}
	return ret;
}
int main()
{
	struct s arr3[] = { {20,"张三"},{30,"李四"} };
    struct s arr4[4] = { 0 };
    my_memcpy(arr4, arr3, sizeof(arr3));
	for (int i = 0; i < 2; i++)
	{
		printf("%d %s\n", arr4[i].age, arr4[i].name);
	}
}

4总结

希望各位佬们提提建议,感谢阅读,点个赞吧.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

库函数memcpy的实现 的相关文章

随机推荐

  • 推荐3个小程序开源组件库——Vant、iView、ColorUI

    推荐3个小程序开源组件库 在进行小程序开发时 xff0c 经常会遇到编写组件方面的阻碍 xff0c 这让我们花费大量的时间在页面以及 CSS 样式编写上 因此可以使用开源组件库 xff0c 有些复杂的组件可以直接拿来使用 xff0c 节省开
  • 试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)

    两种原因 第一种为程序的运行以平台系统位数不匹配 第二种则是该死的VS整出来的 一般在下面三种情景下会发生 1 64位系统上C 调用32位的C 43 43 dll 2 64位系统上IIS发布含有32位的 dll应用程序时 3 64位系统上编
  • 怎么进bios设置硬盘启动顺序|电脑bios硬盘启动设置方法

    怎么在BIOS里设置硬盘启动 xff1f 电脑在启动时会从硬盘寻找引导文件 xff0c 从而启动系统 xff0c 如果硬盘不是第一启动项 xff0c 或者有两个硬盘 xff0c 就会导致系统无法启动 xff0c 这时候就需要进BIOS设置硬
  • Windows计划任务执行时不显示窗口的问题

    最近开发了工具 xff0c 带界面的 xff0c 需要定时执行的 xff0c 为了方便直接用Windows计划任务做定时了 跑了一段时间发现 xff0c 进程中也有 xff0c 就是看不到程序的界面 xff0c 进程的执行貌似也阻塞了 从网
  • JAVA的@EXCEL导出导入常用注解汇总

    在实际开发中经常需要使用导入导出功能来加快数据的操作 在项目中可以使用注解来完成此项功能 在需要被导入导出的实体类属性添加 64 Excel注解 参数类型默认值描述sortintInteger MAX VALUE值越小越靠前readConv
  • MySQL中order by排序将NULL排在最前或最后面

    NULL的意思表示什么都不是 xff0c 或者理解成 未知 也可以 xff0c 它与任何值比较的结果都是false 注意 xff1a 默认情况下 xff0c MySQL会认为NULL值比其他类型的数据小 xff0c 也就是说 xff1a 在
  • C# 如何获取本机IP

    百度搜索的方案 如果你去百度C 如何获取本机IP xff0c 那么大概率的你会得到以下的几段代码 xff0c 第一种就是这样 xff1a string name 61 Dns GetHostName IPAddress ipadrlist
  • winform DevExpress contextMenuStrip右键事件

    span class token keyword private span span class token return type class name span class token keyword void span span sp
  • Linux TCP连接数限制配置

    在进行接口测试时 xff0c 在用户数超过400后 xff0c 就会出现socket connection reset xff0c 明显就是系统无法创建连接 xff0c 查看此时系统建立的TCP连接 xff0c netstat ant gr
  • 摘要认证及实现HTTP digest authentication

    最近工作需要做了摘要认证 xff08 digest authentication xff09 xff0c 下面就工作中遇到的问题及过程做一个总结 第一次客户端请求 GET POST 服务器产生一个随机数nonce xff0c 服务器将这个随
  • HTTPURL Connection及session保存问题

    HTTPURL Connection及session保存问题 HTTPURL Connection是一种多用途 轻量极的HTTP客户端 xff0c 使用它来进行HTTP操作可以适用于大多数的应用程序 虽然HttpURLConnection的
  • SpringBoot 集成redis-jedis

    SpringBoot 集成redis jedis 配置application properties中的redis Redis配置 Redis数据库索引 xff08 默认为0 xff09 spring redis database 61 0
  • Python爬虫常用之登录(三) 使用http请求登录

    前面说了使用浏览器登录较为简单 不需要过多分析 而使用请求登录恰恰就是以分析为主 开发一个请求登录程序的流程 分析请求 gt 模拟请求 gt 测试登录 gt 调整参数 gt 测试登录 gt 登录成功 一 分析网页 从网页着手 打开博客园的登
  • memmove的算法思想

    1 memmove的用法 C 库函数 void memmove void str1 const void str2 size t n 从 str2 复制 n 个字符到str1 如果目标区域和源区域有重叠的话 memmove 能够保证源串在被
  • 菜菜之路-C语言求阶乘和

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 前言一 阶乘是什么 xff1f 二 思想 1 思路12 思路2总结 前言 C语言其实要学好并不简单碰到一道题我们有时根本无从下手
  • 题目:将一个正整数分解质因数。例如:输入90,打印出90=2 * 3 * 3 * 5

    思路1 xff1a 首先先提一个这样的思路 假如这个数是90 xff0c 我们让它被2到90之间的数进行整除 xff0c 如90 2 61 45 0 余数 xff0c 90 3 61 30 我们获取这样的除数 但是有问题 xff0c 90每
  • C语言--求比赛名次问题

    题目内容 xff1a 5位运动员参加了10米台跳水比赛 xff0c 有人让他们预测比赛结果 xff1a A选手说 B第二 xff0c 我第三 B选手说 我第二 xff0c E第四 C选手说 我第一 xff0c D第二 D选手说 C最后 xf
  • 编写程序,输入一个较小的实数deta,利用e=1+1/1(嘿哈)+1/2(嘿哈)+1/3(嘿哈)+⋯+1/n(嘿哈)计算e的近似值,直到最后一项的绝对值小于deta时为止,输出此时e的近似值。

    碰到了一种避开惯性思维的写法想分享出来 由于标题不能打叹号 你品一下哈 include lt stdio h gt include lt math h gt int main int n 61 1 double e 61 1 0 term
  • Linux主板支持多机系统的Mark/Space校验

    Linux主板支持多机系统的Mark Space校验 关键词 xff1a Linux 主板摘要 xff1a 英创Linux主板可以通过RS485总线挂载多个单片机组成多机系统 xff0c 当从机设备比较多 传输数据比较频繁的时候 xff0c
  • 库函数memcpy的实现

    1 先看一下memcpy的声明 从str2所指向的内容的n个字节 复制到str1所指向的内容中 注意这里是n个字节 后面实现该库函数时我会详细解释 size t你们可以查一下它的定义 代表着无符号整型 2 好 来看看我们如何实现它 void