内存操作函数:

函数介绍:

1.memcpy函数

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

这个函数主要用于拷贝内存中的数据,将src中的数据拷贝到dest的空间中。

我自己的实现:

void* my_memcpy(void* dest,const void* src, size_t num)
{
	assert(dest != NULL);
	assert(src != NULL);
	char* tmp1 = (char*)dest;//一个字节一个字节地改变
	char* tmp2 = (char*)src;
	void* ret = dest;
	while (num--)//总字节数一直减到0
	{
		*(char*)tmp1 = *(char*)tmp2;
		tmp1++;
		tmp2++;
	}
	return ret;
}
int main()
{
	char arr1[] = "abcdeff";
	char arr2[50] = { 0 };
	char* ret=(char*)my_memcpy(arr2, arr1, sizeof(arr1));
	printf("%s", ret);
	return 0;
}

2.memmove函数

void* my_memmove(void* dest,const void* src, size_t num)

这个函数用于拷贝字符串,但与前面memcpy函数不同的是这个函数多用于拷贝有重叠部分的字符串的函数。如将字符串arr1[]={0,1,2,3,4,5,6,7,8,9}中的前4个字符0,1,2,3拷贝到2,3,4,5中去。而2、3是重叠部分。即满足使用这个函数的条件。

代码实现:

void* my_memmove(void* dest, const void* src, int num)
{
	assert(dest);
	assert(src);
	void* ret = dest;
	if (dest < src)//目标空间在原空间左边,从前往后拷贝
	{
		while (num--)
		{
			*((char*)dest) = *((char*)src);
			++(char*&)dest;
			++(char*&)src;
		}
	}
	if (dest > src)//目标空间在原空间右边,从后往前拷贝
	{
		while (num--)
		{
			*((char*)dest+num) = *((char*)src+num);
		}
	}
	return ret;
}
int main()
{
	int arr1[] = {0,1,2,3,4,5,6,7,8,9};
    my_memmove(arr1+2,arr1,20);
	//将0,1,2,3,4拷贝到2,3,4,5,6中
	//目标数组0,1,0,1,2,3,4,7,8,9
	return 0;
}

3.memcmp函数

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

将目标区域的内容与原区域的内容进行对比,可设置count来规定用来对比的长度(单位字节)。(vs2019环境下)若dest<src,返回-1;若dest>src,返回1;若dest=src,返回0;

4.memset函数

void* memset( void* dest, int c, size_t count );

这个函数可以用于将字符放入目标空间,其中dest为目标空间地址,c为要放入的字符,count为要放入的字符的个数(一个修改单位为一个字节)。如:

int main()
{
	char arr1[10] = {0};
	memset(arr1,'e',10);
	int arr2[10] = {0};
	memset(arr2, 8, 10);
	return 0;
}

arr1的改变没问题,因为char类型的数组每个单位都是1个字节,所以可以改变10个单位

而arr2的变化就有问题,因为这个函数的改变是以字节为单位,所以改变时只改变前面10个字节,而int类型的函数一个单位是4个字节,所以只能改变前面的一些内容。

---2022/2/8