Error[8]: Undefined offset: 20, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

概述1.与字符串函数strcpy区别: memcpy与memmove都是对内存进行拷贝可以拷贝任何内容,而strcpy仅是对字符串进行 *** 作。 memcpy与memmove拷贝多少是通过其第三个参数进行控制

1.与字符串函数strcpy区别:

memcpy与memmove都是对内存进行拷贝可以拷贝任何内容,而strcpy仅是对字符串进行 *** 作。memcpy与memmove拷贝多少是通过其第三个参数进行控制而strcpy是当拷贝至'2.函数说明:        '停止。

memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝N个字节到目标dst所指的内存地址的起始位置中。

memmove函数的功能同memcpy基本一致,但是当src区域和dst内存区域重叠时,memcpy可能会出现错误,而memmove能正确进行拷贝。3.拷贝情况:

      拷贝的具体过程根据dst内存区域和src内存区域可分为三种情况:

      1.当src内存区域和dst内存区域完全不重叠

     2.当src内存区域和dest内存区域重叠时且dst所在区域在src所在区域前

     3.当src内存区域和dst内存区域重叠时且src所在区域在dst所在区域前

 

     上述三种情况,memcpy可以成功对前两种进行拷贝,对第三种情况进行拷贝时,由于拷贝dst前两个字节时覆盖了src原来的内容,所以接下来的拷贝会出现错误。而memmove对第三种情况进行拷贝时会从src的最后向前拷贝N个字节,避免了覆盖原来内容的过程。

4.代码实现

memcpy:

voID* _memcpy(voID* dest,const voID* src,size_t count){ assert(src != nullptr&&dest != nullptr); //判断dest指针和src指针是否为空,若为空抛出异常 char* tmp_dest = (char*)dest; const char* tmp_src = (const char*)src; //将指针dest和指针src由voID强转为char, //使得每次均是对内存中的一个字节进行拷贝 while (count--) *tmp_dest++ = *tmp_src++; return dest;}

voID* _memmove(voID* dest,size_t count){	assert(src != nullptr&&dest != nullptr);	//判断dest指针和src指针是否为空,若为空抛出异常	char* tmp_dest = (char*)dest;	const char* tmp_src = (const char*)src;	if (tmp_src < tmp_dest)//当src地址小于dest地址时,从头进行拷贝		while (count--)			*tmp_dest++ = *tmp_src++;	else if (tmp_src > tmp_dest)//当src地址大于dest地址时,从后进行拷贝	{		tmp_src += count - 1;		tmp_dest += count - 1;		while (count--)			*tmp_dest-- = *tmp_src;	}	//else(tmp_src==tmp_dest) 此时不进行任何 *** 作	return dest;}

memmove: 

[+++]

转载于https://www.cnblogs.com/lyl-312/p/5514988.HTML

总结

以上是内存溢出为你收集整理的C/C++ memmove与memcpy的区别及实现全部内容,希望文章能够帮你解决C/C++ memmove与memcpy的区别及实现所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 165, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
CC++ memmove与memcpy的区别及实现_C_内存溢出

CC++ memmove与memcpy的区别及实现

CC++ memmove与memcpy的区别及实现,第1张

概述1.与字符串函数strcpy区别: memcpy与memmove都是对内存进行拷贝可以拷贝任何内容,而strcpy仅是对字符串进行 *** 作。 memcpy与memmove拷贝多少是通过其第三个参数进行控制

1.与字符串函数strcpy区别:

memcpy与memmove都是对内存进行拷贝可以拷贝任何内容,而strcpy仅是对字符串进行 *** 作。memcpy与memmove拷贝多少是通过其第三个参数进行控制而strcpy是当拷贝至'2.函数说明:        '停止。

memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝N个字节到目标dst所指的内存地址的起始位置中。

memmove函数的功能同memcpy基本一致,但是当src区域和dst内存区域重叠时,memcpy可能会出现错误,而memmove能正确进行拷贝。3.拷贝情况:

      拷贝的具体过程根据dst内存区域和src内存区域可分为三种情况:

      1.当src内存区域和dst内存区域完全不重叠

     2.当src内存区域和dest内存区域重叠时且dst所在区域在src所在区域前

     3.当src内存区域和dst内存区域重叠时且src所在区域在dst所在区域前

 

     上述三种情况,memcpy可以成功对前两种进行拷贝,对第三种情况进行拷贝时,由于拷贝dst前两个字节时覆盖了src原来的内容,所以接下来的拷贝会出现错误。而memmove对第三种情况进行拷贝时会从src的最后向前拷贝N个字节,避免了覆盖原来内容的过程。

4.代码实现

memcpy:

voID* _memcpy(voID* dest,const voID* src,size_t count){ assert(src != nullptr&&dest != nullptr); //判断dest指针和src指针是否为空,若为空抛出异常 char* tmp_dest = (char*)dest; const char* tmp_src = (const char*)src; //将指针dest和指针src由voID强转为char, //使得每次均是对内存中的一个字节进行拷贝 while (count--) *tmp_dest++ = *tmp_src++; return dest;}

voID* _memmove(voID* dest,size_t count){	assert(src != nullptr&&dest != nullptr);	//判断dest指针和src指针是否为空,若为空抛出异常	char* tmp_dest = (char*)dest;	const char* tmp_src = (const char*)src;	if (tmp_src < tmp_dest)//当src地址小于dest地址时,从头进行拷贝		while (count--)			*tmp_dest++ = *tmp_src++;	else if (tmp_src > tmp_dest)//当src地址大于dest地址时,从后进行拷贝	{		tmp_src += count - 1;		tmp_dest += count - 1;		while (count--)			*tmp_dest-- = *tmp_src;	}	//else(tmp_src==tmp_dest) 此时不进行任何 *** 作	return dest;}

memmove: 

转载于https://www.cnblogs.com/lyl-312/p/5514988.HTML

总结

以上是内存溢出为你收集整理的C/C++ memmove与memcpy的区别及实现全部内容,希望文章能够帮你解决C/C++ memmove与memcpy的区别及实现所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1209476.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存