内存函数-----Memcpy函数

memcpy函数

头文件:

函数功能:将从源地址source开始的num个字节复制到目标地址destination处

函数参数及返回值类型:void* memcpy(void* destination, const void* source, size_t num)

参数解释:

1.因为不确定要复制的数据是什么类型的,所以指针类型设计为void类型

2.用const来保护源地址处的数据,以防止数据被篡改

3.函数的返回类型是无类型指针类型

函数使用:

包含源地址的数组arr1:arr1[10]={1,2,3,4,5,6,7,8,9,10};

包含目标地址的数组arr2:arr2[5]={0};

将数组arr1的后五个数据复制到数组arr2中

输出结果:arr2:arr2[5]={6,7,8,9,10};

代码实现:

#include 

#include 

int main()
{
	int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };

	int arr2[5] = { 0 };
	
	memcpy(arr2, arr1+5, 20);

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

	return 0;
}

代码实现memcpy函数的功能:

#define _CRT_SECURE_NO_WARNINGS
#include 
#include 
void* my_memcpy(void* dest, const void* sour, size_t num)
{
	//将源内存中的num个字节复制到目标内存中
	assert(dest && sour);
	void* temp=dest;
	char* dest1 = ((char*)dest);
	char* sour1 = ((char*)sour);
	while (num)
	{
		*dest1 = *sour1;
		dest1++;
		sour1++;
		num--;
	}
	return temp;
}
int main()
{
	int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };

	int arr2[5] = { 0 };
	
	my_memcpy(arr2, arr1+5, 20);
	for (int i = 0; i < 5; i++)
	{
		printf("%d\n", arr2[i]);
	}
	return 0;
}

注意事项:

1.将destination和source的类型转化至字符指针类型,这样加1时跳过一个字节,步长为1;

2.为什么dest++编译不成功,因为强制转化类型是一个临时的状态,使用完之后。dest又重新变成了无类型指针变量,无法确定+1的步长,可以写成:`dest=(char*)dest+1`,sour指针也是如此;

3.可以加一个断言assert(头文件->assert.h),判断 dest 和 sour 指针是否为空指针;

4.如果源地址与目标地址的空间有冲突的话,就不能成功拷贝,因为数据被篡改了,memcpy函数应该拷贝不重叠的内存;

5.C语言规定memcpy函数只要实现了不重叠内存的拷贝就可以了,但是VS中的memcpy超额完成了任务,可以实现重叠和不重叠内存的拷贝;

下篇文章介绍内存函数memmove函数。

特别鸣谢:哔哩哔哩比特鹏哥的视频教程

你可能感兴趣的:(C语言库函数,c++,c语言)