内存函数详解与模拟实现

目录

1.memcpy函数

1.1memmcpy函数的模拟使用

2.memmove函数

2.1memmove 函数的模拟使用

3.memcmp

3.1memcmp函数的模拟实现

4.memset (内存设置)

4.1memset函数的模拟实现


1.memcpy函数

void* memcpy(void* destination, const void* source, size_t num);//之所以是void*类型是因为接收数据无法确认所以用泛型指针

数memcpy从source的位置开始向后复制num个字节数据到destination的内存位置。

这个函数在遇到'\0'的时候并不会停下来。

如果source和destination有任何重叠,复制的结果都是未定义的。

#include<stdio.h>
#include<string.h>
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7 };
	int arr2[20] = { 0 };//我们如果想把arr1拷贝到arr2中,strcpy肯定是行不通的,因为其是字符串拷贝不能拷贝整形
	memcpy(arr2, arr1,28);
	int i = 0;
	for(i=0;i<7;i++)
	{
		printf("%d\n", arr2[i]);
	}
	return 0;
}

1.1memmcpy函数的模拟使用

#include<stdio.h>
#include<stdio.h>
char* my_memcpy(void* dest, void* stc, size_t num)
{
	void* p = dest;
	while (num)
	{
		*((char*)dest) = *((char*)stc);
		((char*)dest)++;
		((char*)stc)++;
		num--;
	}
	return p;
}
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7 };
	int arr2[20] = { 0 };
	my_memcpy(arr2, arr1,28);
	int i = 0;
	for(i=0;i<7;i++)
	{
		printf("%d\n", arr2[i]);
	}
	return 0;
}

如果我们想arr1作为源空间拷贝到目标空间arr1+2中:

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

我们想要的是1 2 1 2 3 4 5 8 9 10,但运行结果却是:

注意:尽量不要自己拷贝自己(新的编译器会自我优化,但版本较低的编译器不能优化),会出现自己覆盖自己的情况 ,重叠字符串的拷贝要用memmove函数。

2.memmove函数

void * memmove(void* destination,const void* source,size_t  num); 

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

 这和我们想要的结果是完全一样的。

2.1memmove 函数的模拟使用

#include<stdio.h>
void* my_memmove(void* dest, const void* src, size_t num)
{
	void* ret = dest;
	if (dest < src)
	{
		//从前往后拷贝
		while (num--)
		{
			(*(char*)dest) = (*(char*)src);
			((char*)dest)++;
			((char*)src)++;
		}
	}
	else
	{
		//从后往前拷贝
		while (num--)//num先使用后--
		{
			*((char*)dest + num) = *((char*)src + num);//在这里dest、与src并不需要改变因为num会改变
		}
	}
	return ret;
}
int main()
{
	int arr1[20] = { 1,2,3,4,5,6,7,8,9,10 };
	my_memmove(arr1 + 2, arr1, 20);
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr1[i]);
	}
	return 0;
}

3.memcmp

int memcmp(const void* ptr1,const void* ptr2,size_t num);

比较从ptrt1和ptr2指针开始的num个字节

返回值如下:

这和strcmp的返回值是基本一致的。

#include<stdio.h>
int main()
{
	int arr1[] = { 1,2,3,4,5 };
	int arr2[] = { 1,3,2 };
	int ret=memcmp(arr1, arr2, 12);
	printf("%d\n", ret);//运行结果为-1
	return 0;
}

3.1memcmp函数的模拟实现

#include<stdio.h>
int my_memcmp(const void* ptr1, const void* ptr2, size_t num)
{
	while(num--)
	{
		if (*(char*)ptr1 > *(char*)ptr2)
			return 1;
		else if (*(char*)ptr1 < *(char*)ptr2)
			return -1;
		else
		{
			((char*)ptr1)++;
			((char*)ptr2)++;
		}
	}
	return 0;
}
int main()
{
	int arr1[] = { 1,2,3,4,5 };
	int arr2[] = { 1,2,3,7,9 };
	int ret=my_memcmp(arr1, arr2, 13);
	printf("%d\n", ret);//这和库函数memcmp所运行的结果是一致的都是-1
	return 0;
}

4.memset (内存设置)

void* memset(void* ptr,int value,size_t mum);

#include<stdio.h>
int main()
{
	char arr[] = "hello bit";
	memset(arr,'x', 5);
	printf("%s\n", arr);
	return 0;
}

4.1memset函数的模拟实现

#include<stdio.h>
void* my_memset(void* ptr, int value, size_t num)
{
	void* ret = ptr;
	while (num--)
	{
		(*(char*)ptr) = value;
		((char*)ptr)++;
	}
	return ret;
}
int main()
{
	char arr[] = "hello bit";
	my_memset(arr,'x', 5);
	printf("%s\n", arr);
	return 0;
}

  • 32
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 35
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 35
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值