模拟实现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!!!