用C语言模拟实现memcpy函数,memmove函数和memset函数-创新互联

模拟实现memcpy函数:

作为一家“创意+整合+营销”的成都网站建设机构,我们在业内良好的客户口碑。成都创新互联提供从前期的网站品牌分析策划、网站设计、成都网站设计、成都网站建设、创意表现、网页制作、系统开发以及后续网站营销运营等一系列服务,帮助企业打造创新的互联网品牌经营模式与有效的网络营销方法,创造更大的价值。

函数原型:void *memcpy (void *p,void *m, size_t num);

memcpy与strcpy相比,memcpy函数用来做内存拷贝,可以用它拷贝任何数据类型的对象,并且可以指定拷贝的数据长度。stycpy函数也是用来做内存拷贝,并且只能拷贝字符串类型的数据。memcpy并不是遇到"\0"就结束,而是一定会拷贝完num个字节。而strcpy 遇到"\0"就结束。

memcpy函数代码:

#include 
#include 
void my_memcpy(void *p,const void *m,size_t num)
{
	char *str1 = (char *)p;
	const char *str2 = (const char *)m;
	assert(p);
	assert(m);
	while(num)
	{
		*str1=*str2;
		str1++;
		str2++;
		num--;
	} 
}
int main()
{
	int arr[]={1,2,3,4,5,6,7,8,9};
	int i;
	my_memcpy(arr,arr+3,sizeof(int)*5);
	for(i=0;i<9;i++)
	{
		printf("%d",arr[i]);
	}
	return 0;
}

 memcpy可以拷贝任何数据类型的对象,比如,上段代码中用memcpy实现了拷贝int 型的数组,用memcpy实现数组的拷贝只能是后面的拷贝前面的,上面代码中从数组的arr+3向arr拷贝,在main函数中存入形参(arr,arr+3,sizeof(int)*5),在调用函数中用void型的指针接收(void *p,const void* m,size_t num),void可以指向任何类型的指针,但是由于复制的时候要一个个字节去复制,所以我们需要把void转换成char类型,然后char类型的两个指针进行拷贝,指针地址加加。

 模拟实现memmove函数;

memmove和memcpy函数都是C语言中的库函数,作用是拷贝一定长度的内存的内容,它们的作用是一样的,唯一的区别就是当内存发生局部重叠的时候,memmove保证拷贝的结果是正确的,memcpy不保证拷贝的结果是正确的。

memmove函数代码:

#include 
#include 

void my_memmove(void *p,const void *m,size_t num)
{
	char *str1 = (char *)p;
	const char *str2 = (const char *)m;
	assert(p);
	assert(m);
	if (str1>str2 && str1 < str2+num)
	{
		while (num--)
		{
			*(str1+num) = *(str2+num);
		}
	}
	else
	{
		while(num)
		{
			*str1=*str2;
			str1++;
			str2++;
			num--;
		}
	}
}

int main()
{
	int arr[]={1,2,3,4,5,6,7,8,9};
	int i;
	//my_memmove(arr,arr+3,sizeof(int)*5);
	my_memmove(arr+3,arr+1,sizeof(int)*5);
	for(i=0;i<9;i++)
	{
		printf("%d",arr[i]);
	}
	return 0;
}

memmove分两种情况一种是拷贝时内存内部没有发生局部重叠的时候,它的拷贝方式跟memcpy是相同的,另一种是内存内部发生局部重叠时,相当于(str1>str2&&str1

 模拟实现memset函数:

函数原型是:void *memset(void *src,int num,size_t len);

memset函数通常用来对一块已经分配地址的内存进行初始化,并且通常初始化为0.

#include 
#include 
void my_memset (void *src,int num,size_t len)
{
	char *ptr=(char*)src;
	while(len--)
	{
		*ptr=((char*)num);
		ptr++;
	}
}

int main()
{
	int arr[10];
	int i;
	my_memset(arr,0,5*sizeof(int));
	for (i=0;i<10;i++)
	{
		printf("%d ",arr[i]);
	}
	return 0;
}

一定需要注意的是,memset是按照字节对初始化空间进行初始化的,也就是说,函数里面的第二个参数的那个初值是按照一个一个字节往第一个参数所指区域赋值的,所以对于单字节数据类型(char)可以初始化为任何值,但对于非但字节数据类型只能初始化为0.

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


当前文章:用C语言模拟实现memcpy函数,memmove函数和memset函数-创新互联
标题来源:http://myzitong.com/article/djdhpg.html