内存操作函数-一、memcpy

时间:2024-10-22 13:44:10

在字符串函数的学习当中,我们学习使用了strcpy函数,strcpy是用来拷贝字符串的,但是我们想要拷贝其他类型的数据我们又该怎么办呢?这时候就得学习内存中的一些操作函数了。

1、memcpy函数原型和功能

memcpy函数由英文名可知memory copy(内存拷贝),该函数的功能就是拷贝内存中的数据的,不管数据是什么类型。

函数原型
在这里插入图片描述
功能

所以综上,memcpy函数的功能就是将source的num个字节拷贝给destination,并且将destination函数首元素的地址进行返回。memcpy函数使用前需包含头文件string.h

函数使用

#include<stdio.h>
#include<string.h>
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[30] = { 0 };
	memcpy(arr2, arr1, 20);
	for (int i = 0; i < 30; i++)
	{
		printf("%d ",arr2[i]);
	}
	return 0;
}

在这里插入图片描述

在这里使用memcpy函数将arr1中的20个字节传递给arr2,arr2原先存放的全是0,将arr1中的20个字节也就是5个元素拷贝给arr2,arrr2打印后成上图所示。memcpy函数能拷贝所有类型的数据,例如像下方的字符数据的拷贝

在这里插入图片描述
与strcpy函数相比,memcpy函数只负责内存的拷贝,他才不会管内存中是否存在'\0',只要你让他拷贝多少个字节,他就拷贝多少个字节。而strcpy则是遇到'\0'停止拷贝并将'\0'也拷贝过去。

2、memcpy函数模拟实现

在实现memcpy函数功能我们得先了解以下几点:

  1. memcpy函数实现的是所有类型的数据的拷贝,那么在参数接收方面我们就得需要能接收全部类型的数据,所以我们采用void*,然后我们每个类型的数据字节长度不相同,为了能够拷贝,我们将一个字节一个字节的内容进行拷贝。计算机将内存分为一个个小的内存单元,一个内存单元为一个字节,所以这个函数就叫做内存拷贝函数。
  2. 因为参数是void*的指针,而我们要交换一个字节的数据,那我们应该将传进来的参数强制类型转换成char*类型的,这样指针+1就跳过一个字节的数据。
  3. 判断参数有效性,假如传进来的参数是NULL空指针,那么就不能对他进行解引用,此时我们需要对参数进行判断。
  4. 因为memcpy函数返回的是destination的地址,但是在后面传递数据的时候,destination已经不指向首元素的地址,所以在交换数据之前,我们应当先保存destination首元素的地址。
  5. 为避免溢出,destination 和 source 参数指向的数组的大小应至少为 num 字节,并且不应重叠(对于重叠的内存块,memmove 是一种更安全的方法)。

函数实现

#include<stdio.h>
#include<string.h>
#include<assert.h>
void* my_memcpy(void* des, const void* src,size_t num)
{
	void* ret = des;
	assert(des && src);

	int i = 0;
	while (num--)
	{
		*((char*)des + i) = *((char*)src + i);
		i++;
	}

	return ret;
}