ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

模拟实现memcpy

2021-03-08 22:58:22  阅读:208  来源: 互联网

标签:src 实现 void des char memcpy 模拟 指针


模拟实现memcpy


函数原型
void *memcpy( void *dest, const void *src, size_t count );

头文件
<string.h>

功能
memcpy函数从src(源内存地址起始位置)拷贝count个字节到des(目的地内存地址的起始位置)

使用须知
memcpy函数处理内存非重叠区,即 不处理des地址为自身内存范围的函数操作。
memmove函数除包含memcpy的函数功能,还可以处理内存重叠区拷贝操作哦

函数实现思路
首先,将主函数部分大体框架完成。

接下来完成My_memcpy内容。我们将完成拷贝操作,所以我们实现的函数参数部分肯定要有des(目的地内存地址的起始位置),src(源内存地址起始位置),和拷贝多少字节的count。

我们要注意,与只处理字符串的strcpy函数相比,memcpy要处理各种类型数据,所以使用可以接受任意指针的void*。返回类型当然也为void*

内容
函数参数有指针,断言不可少。void指针无法进行指针运算,进行拷贝内存操作时,强制类型转换的(char*)不能少(char* ± 1操作往后走一个字节).。最后进行拷贝数据操作。


实现memcpy代码

#include<stdio.h>
#include<assert.h>
typedef struct PerData
{
	char name[20];
	int age;
}PerData;//typedef简化结构体命名

void* My_memcpy(void* des, const void* src, size_t count)
{
	assert(des && src);//断言,对括号里面的假设的条件进行判断
					   //括号中的内容为真,程序正常执行
					   //括号里面的内容为假,屏幕打印出错误源
	void* ret = des;
	while (count--)
	{
		*(char*)des = *(char*)src;
		++(char*)des;//这边要记得前置++,由于空类型指针
		++(char*)src;
		//1.无法进行指针运算,即不能+-整数操作
		//2.空类型指针可以接受任意指针
		//3.不能进行解引用操作
	}
	return ret;
}
int main()
{
	int i = 0;
	PerData A[] = { { "zhangsan",18 },{"lisi",20} };
	PerData B[2] = { 0 };
	My_memcpy(B, A, sizeof(A));
	for (i = 0; i < 2; i++)
		printf("%s\t%d\n", B[i].name, B[i].age);
	return 0;
}

若对你有帮助,别忘了分享收藏 哦!Good Day!!!

标签:src,实现,void,des,char,memcpy,模拟,指针
来源: https://blog.csdn.net/MerryMaking7946/article/details/114554786

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有