当前位置: 首页 > article >正文

【c语言】memmove函数的使用和模拟实现

1.memmove函数的使用

memmove函数是 C 标准库中的一个内存处理函数,定义在 <string.h> 头文件中。与 memcpy 类似,它用于将一块内存区域的内容复制到另一块内存区域。不同的是,memmove 可以安全地处理源和目标内存区域重叠的情况,而 memcpy 在重叠情况下可能会产生未定义行为。

void * memmove ( void * destination, const void * source, size_t num );
  • destination:目标内存区域的起始地址。
  • source:源内存区域的起始地址。
  • num:要复制的字节数。
  • 返回目标内存区域 destination 的起始地址。

 实例:

#include <stdio.h>
#include <string.h>
int main ()
{
char str[] = "memmove can be very useful......";
memmove (str+20,str+15,11);
puts (str);
return 0;
}

运行结果: 

2.memmove函数的模拟实现

#include <stdio.h>
#include <string.h>
void* my_memmove(void* dst, const void* src, size_t count)
{
	void* ret = dst;
//如果目标地址在源地址之前,或者它们不重叠,则从前向后复制字节。
	if (dst <= src || (char*)dst >= ((char*)src + count)) {
		while (count--) {
			*(char*)dst = *(char*)src; //将void*类型的dest和src转换为char*类型,以便逐字节操作
			dst = (char*)dst + 1;
			src = (char*)src + 1;
		}
	}
//如果目标地址在源地址之后,并且它们重叠,则从后向前复制字节,以避免覆盖尚未复制的数据。
	else {
		dst = (char*)dst + count - 1;
		src = (char*)src + count - 1;
		while (count--) {
			*(char*)dst = *(char*)src;
			dst = (char*)dst - 1;
			src = (char*)src - 1;
		}
	}
	return(ret);
}
int main()
{
	char str[] = "memmove can be very useful......";
	my_memmove(str + 20, str + 15, 11);
	puts(str);
	return 0;
}


http://www.kler.cn/a/390803.html

相关文章:

  • ️️一篇快速上手 AJAX 异步前后端交互
  • 机器学习——贝叶斯
  • 【2024最新】基于springboot+vue的闲一品交易平台lw+ppt
  • 【MySQL从入门到放弃】InnoDB磁盘结构(一)
  • 第二节 OSI-物理层
  • ffmpeg内存模型
  • 【Linux】获得同一子网下当前在线设备IP/Latency/MAC 通过nmap指定CIDR扫描当前在线设备
  • Redis在docker中的主从,哨兵配置
  • kafka消费者的消费分区策略有哪些,默认是哪个?
  • C#-命名空间
  • qsqlmysql.lib的编译和使用
  • Java接收xml格式参数转为json
  • sql注入基础知识
  • 海柔仿真系统存储实践:混合云架构下实现高可用与极简运维
  • 【cft.show-web3解题思路】-php://input伪协议
  • 行业类别-金融科技-子类别区块链技术-细分类别智能合约-应用场景供应链金融课题
  • Python 正则表达式使用指南
  • Vue页面假死点不动现象Cannot read properties of undefined(reading ‘_wrapper‘)报错
  • 如何在Linux中使用Cron定时执行SQL任务
  • ROM修改进阶教程------安卓14 安卓15去除app签名验证的几种操作步骤 详细图文解析
  • 机器学习(基础2)
  • HCIP-快速生成树RSTP
  • redis:zset有序集合命令和内部编码
  • 漏洞扫描工具和漏洞利用工具
  • C++ 11新特性:列表初始化,右值引用与移动语义
  • 《TCP/IP网络编程》学习笔记 | Chapter 9:套接字的多种可选项