模拟实现memcpy

一: 功能

类比strcpy,实现的是字符串的拷贝工作。但是memcpy直接对内存进行操作,可以对任意类型进行拷贝。

二:定义与声明

void*memcpy(void*dest,const void*src,size_t count)

void*dest也就是说可以接受任意类型的数据。

size_t count 该函数是按照字节进行拷贝的。

三:使用

下面对char和int类型进行拷贝使用

#define _CRT_SECURE_NO_WARNINGS 1 
#include<stdio.h>
#include<string.h>
int main()
{
	int arr1[100] = {};
	int arr2[] = { 1,2,3,4,5 };
	memcpy(arr1, arr2, 12);

	for (int i = 0; i < 5; i++)
	{
		printf("%d ", arr1[i]);
	}

	char arr3[100] = {};
	char arr4[] = { "hello world" };
	printf("%s\n", (char*)memcpy(arr3, arr4, 3));
	return 0;
}

四:模拟函数的实现

其实memcpy的功能和strcpy差不多,所以实现memcpy可以类比strcpy,只不过看待的角度要更细致。需要清楚他们在内存中的分布

以int类型的数据举例子:

定义int arr1[5]={1,2,3,4,5};

在内存中存储:01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 05 00 00 00 00

目标空间:

因此为了将源内存中的数据取出来放置在目标空间中,则需要逐个字节逐个字节进行访问。

#define _CRT_SECURE_NO_WARNINGS 1 
#include<stdio.h>
#include<assert.h>
void*my_memcpy(void* dest, const void* src, size_t count)
{
	assert(dest && src);
	char* start = (char*)dest;//将目标中的首地址存储在start中,以便于后续更改了dest时,还能返回首地址
	while (count--)
	{
		*(char*)dest = *(char*)src;//逐个逐个进行访问将源中的数据取出来放在目标空间中
		dest = (char*)dest + 1;//由于dest和src是void*类型的数据,因此可以接受任何类型的指针
		src = (char*)src + 1;
	}
	return start;
}
int main()
{
	int arr1[100] = {};
	int arr2[] = { 1,2,3,4,5 };
	my_memcpy(arr1, arr2, 12);

	for (int i = 0; i < 5; i++)
	{
		printf("%d ", arr1[i]);
	}

	return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值