linux源码中关于内存移动或复制的函数详细解说: memmove, memcpy, strcpy

内存操作 内存操作  使用下列函数在内存区域进行基于字节的工作。  内存操作函数:   1.memcppy 将指定的字符或指定数量的字符从一个 buffer 复制到另一个 buffer .      void *_memccpy( void *dest, const void *src, int c, unsigned int count );      所需头文件: or       返回值:      阅读详情

本文讨论的是关于内存复制中内存重叠和不重叠的情况:


memmove

/**
* memmove - Copy one area of memory to another
* @dest: Where to copy to
* @src: Where to copy from
* @count: The size of the area.
*
* Unlike memcpy(), memmove() copes with overlapping areas.
*/
void *memmove(void *dest, const void *src, size_t count)
{
	char *tmp;
	const char *s;

	if (dest <= src) {
		tmp = dest;
		s = src;
		while (count--)
			*tmp++ = *s++;
	} else {
		tmp = dest;
		tmp += count;
		s = src;
		s += count;
		while (count--)
			*--tmp = *--s;
	}
	return dest;
}

函数说明:memmove()是从一个缓冲区移动到另一个缓冲区中。
返回值:   返回指向dest指针。

由于内存地址是线性的,在linux源码中memmove会对源地址和目标地址进行对别,以决定是从源内存块头部开始向尾部复制,还是从源内存快尾部向头部复制.


memcpy

/**
* memcpy - Copy one area of memory to another
* @dest: Where to copy to
* @src: Where to copy from
* @count: The size of the area.
*
* You should not use this function to access IO space, use memcpy_toio()
* or memcpy_fromio() instead.
*/
void *memcpy(void *dest, const void *src, size_t count)
{
	char *tmp = dest;
	const char *s = src;

	while (count--)
		*tmp++ = *s++;
	return dest;
}

函数说明: memcpy()用来拷贝src所指的内存内容前n个字节到dest所指的内存地址上。与strcpy()不同的是,memcpy()会完整的复制n个字节,不会因为遇到字符串结束'\0'而结束
返回值:   返回指向dest的指针

memcpy 并不考虑内存重叠的情况.


strcpy

char * strcpy (char * dst, const char * src)  
{  
    char * cp = dst;  
  
    while( *cp++ = *src++ )  
            ;               /* Copy src over dst */  
    return( dst );  
} 
以上是通常代码



    /* 代码风格应该是K&R风格 */
    char *
    strcpy (dest, src)
         char *dest;
         const char *src;
    {
      reg_char c;
      /*
      关于__unbounded和CHECK_BOUNDS_LOW,可以不作理会,可使其为空的宏定义。
      引入这两个宏的原因是因为bounded pointer,其定义参见wiki:http://en.wikipedia.org/wiki/Bounded_pointer
      */
      char *__unbounded s = (char *__unbounded) CHECK_BOUNDS_LOW (src);

   /*
   计算目的地址dest与源地址s的偏移-1的值。之所以要减去1,是因为后面的代码。
   */

      const ptrdiff_t off = CHECK_BOUNDS_LOW (dest) - s - 1;
      size_t n;

      do
        {
          c = *s++;
          /* 前面计算偏移的时候多减了一个1,就因为上一个语句s进行了自加运算 */
          s[off] = c;
        }
      while (c != '\0');

  
   /* 这部分代码也可以无视 */

      n = s - src;
      (void) CHECK_BOUNDS_HIGH (src + n);
      (void) CHECK_BOUNDS_HIGH (dest + n);

      return dest;
    }

以上是个glibc代码.

可以看出均没有考虑内存重叠情况.






C语言标准库函数模拟实现:从strlen到memcpy的底层原理与优化实践 在C语言编程中,字符串和内存操作函数是构建软件的基础组件。理解其底层原理,而不仅仅是调用API,是提升开发者调试能力和性能优化意识的关键。这些函数的核心在于对内存布局、字节操作和硬件特性的深刻把握,例如通过指针算术遍历内存、利用对齐提升访问效率。从工程实践角度看,掌握这些原理能帮助开发者避免缓冲区溢出等经典漏洞,并理解标准库为何针对不同场景(如memcpy与memmove)做出效率与安全性的权衡。进一步地,在追求极致性能的场景下,库函数会针对特定CPU架构进行深度优化,例如利用ARM NEON等SIMD指令 阅读详情

相关推荐

C语言面试核心考点解析:指针、内存管理与底层原理实战指南

在计算机科学中,内存管理和指针操作是理解程序运行机制的核心基础。指针作为内存地址的抽象,直接关联到数据的存储、访问与生命周期管理,其原理涉及栈、堆等内存区域的分配与回收。掌握这些底层知识不仅能提升代码的健壮性和性能,更是深入理解操作系统、嵌入式系统、高性能中间件等领域的关键。在实际开发中,诸如动态内存分配、结构体内存对齐、多线程数据同步等场景都离不开对内存模型的清晰认知。本文围绕C语言面试中的高频考点,系统梳理了指针的多层语义、动态内存管理、关键字作用域以及预处理器等核心概念,并通过典型面试题剖析,帮助开发

weixin_34342207的博客 354

memmove和memcpy

<br />1.memmove<br />函数原型:void *memmove(void *dest, const void *source, size_t count)<br />返回值说明:返回指向dest的void *指针<br />参数说明:dest,source分别为目标串和源串的首地址。count为要移动的字符的个数<br />函数说明:memmove用于从source拷贝count个字符到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标

RTC hacker 938

固件漏洞挖掘实战:从环境搭建到漏洞利用的完整指南

在物联网和嵌入式设备安全领域,固件作为连接硬件与操作系统的底层软件,其安全性直接决定了设备的核心防护能力。理解固件的工作原理,是进行深度安全评估的基础。固件通常存储在设备的非易失性存储器中,负责初始化硬件、加载操作系统并提供最底层的运行时服务。其技术价值在于,通过分析固件,安全研究人员可以摆脱“黑盒”测试的局限,以“白盒”视角审计设备最核心的代码逻辑,从而发现那些被上层应用封装、常规测试难以触及的深层漏洞,例如内存破坏和逻辑缺陷。这种能力在智能家居、工业控制和网络设备等应用场景中尤为重要,能够有效评估设备被

465

memmove

memmove 是 C 和 C++ 的标准库函数,用于在内存中移动数据。它的作用是将从源地址开始的连续的 n 个字节移动到目标地址开始的位置。与 memcpy 不同的是,memmove 可以正确处理源和目标区域有重叠的情况。 它的声明如下: void *memmove(void *dest, const void *src, size_t n); 参数是: 目标地址,源地址,移动的字节数。 返回值...

weixin_35755434的博客 243

memcpy源码

memcpy和strcpy一样,没有处理内存重叠;而memmove函数对这种情况进行了处理。了解一下实现方法,大体如下: void *memcpy(void *dst, const void *src, size_t len) { if(NULL == dst || NULL == src){ return NULL; } void *ret = dst; if(dst &lt...

一首小夜曲 1014

【信息科学与工程学】计算机科学与自动化——第二十四篇 编译器04 LLVM编译器02

B-WUCL(用户权重均匀对比损失)和D-WUCL(物品权重均匀对比损失)中,动态调整参数λ_new(新用户补偿因子)和α(长尾补偿强度)是优化推荐系统适应数据分布变化的核心。

weixin_49199313的博客 1242

C语言内存函数(memcpy、memmove、memcmp)详解

memove函数为内存移动函数,也就是将来源空间内容移动到目的地空间之中。相当于拷贝。其参数类型和返回值和memcpy完全相同,其含义为将source(来源)前num个字节数空间的内容移动到destination(目的地)空间之中,和拷贝含义几乎相同。这就过多介绍了。其用法也基本相同,只不过,memmove函数可以处理重叠内存空间的拷贝。直接看实例memcmp函数为内存比较函数,其与字符串比较函数strcmp函数相像,不同的是memcmp函数可以既可以比较整形、浮点型,也可以比较字符串。

cdnio的博客 1万+

linux memcpy源码

linux内核源码:memcpy,对比这个就发现了自己的不足,memcpy真能考验程序员的编程技能与逻辑思维

【操作系统】Linux Kernel中memcpy的汇编实现 详解(包括必要基础概念等)

memcpy汇编实现 由于这篇博客是从我的各种笔记上搬的 我不知道自己为什么看了mmcpy汇编实现,也许单纯就是因为好玩 在arch/x86/boot/Copy.S中,由Linus在1992年写的一段代码 GLOBAL(memcpy) pushw %si pushw %di movw %ax, %di movw %dx, %si pushw %cx shrw $2, %cx rep; movsl popw %

CheAyuki13的博客 2727

专治疑难系列 - 解决打印机凭证冲突问题

一、问题描述 二、解决方法 三、问题已解决

Passerby_Wang的博客 2万+

第四章 自定义组件、动画

第三章 自定义组件、动画 (一)自定义View 1.1) onMeasure:对当前View的尺寸进行测量 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) widthMeasureSpec和heightMeasureSpec包含测量模式和尺寸大小 int widthMode = MeasureSpec....

Stay Hungry Stay Foolish 求知若饥 虚心若愚 8131

【C语言】《C 语言模拟实现字符串与内存操作全系列(含最常用12个模拟实现)》

C语言开发过程中,最频繁的操作之一就是处理字符串。不管是用户输入、文件读取、还是网络数据解析,都绕不开各种字符串操作。C语言中对字符和字符串的处理非常频繁,但C语言本身没有字符串类型,字符串通常放在字符数组中,或者放在常量字符串中常量字符串是只读的,适用于那些不需要修改字符串内容的函数。目标空间必须足够大、还得确保字符串有'\0'结尾等。

2501_93351213的博客 473

PSI5协议技术文档与驱动开发指南

• 供电与数据复用:ECU通过双绞线为传感器提供稳压(典型值5V-11V),同时检测线路电流变化实现数据传输。• 同步信号:ECU发送3.5V电压脉冲(上升沿触发传感器响应),用于时序同步。• 安全气囊:PSI5-P模式实现多碰撞传感器同步采样(响应时间<10ms)• CRC-3(3位):ASIL-B以上功能安全要求(如动力总成传感器)• 奇偶校验(1位):适用于低安全等级场景(如PSI5-P10P模式)• 典型应用:PSI5-P(并行总线)、PSI5-U(通用总线)

u012733413的博客 2867

C++工程级学习路径:从内存布局到系统级实战

C++是一门深度绑定硬件与操作系统的编程语言,其核心价值在于对内存、CPU指令、系统调用的精确控制。理解对象内存布局、编译器生成汇编、RAII资源生命周期等底层原理,是构建高性能、低延迟、高可靠系统的前提。技术价值体现在嵌入式开发、高频交易、游戏引擎、自动驾驶等对确定性行为和资源可控性要求严苛的领域。典型应用场景包括std::string零拷贝转换、epoll高并发服务器实现、具身智能桥接层设计等。本教程聚焦真实工程验证——通过ASan/UBSan内存检测、多编译器兼容性实测、perf性能归因分析,将C++

weixin_30873847的博客 342

分析国外几款主流蜜罐产品看欺骗诱捕技术的应用脉络

网络安全的本质是攻防对抗,更本质的其实是人与人心智与技术的全面较量。 欺骗诱捕技术作为攻防对抗技术中比较特殊的技术,能够使防守方更多掌握对抗中的主动权,诱导攻击,迫使攻击者耗费精力的同时,留下丰富的攻击信息。究其本质,欺骗诱捕技术更深层次考验的不止是技术的能力,还有对于攻击者作为人的理解。 国外主流蜜罐产品分析 根据MarketsandMarkets《欺骗技术市场规模、份额和2021年全球市场预测》中提到的欺骗诱捕技术全球主要供应商及产品,我们分析了几款国外主流的蜜罐产品,希望更清晰看到欺骗诱捕技术应

cdyunaq的博客 1307

别光看Demo了!用UE5 Lyra框架快速搭建你的多人对战游戏原型(含完整配置流程)

本文详细介绍了如何利用UE5 Lyra框架快速搭建多人对战游戏原型,包含完整的配置流程和实战案例。Lyra作为可直接二次开发的游戏模板,内置了GAS技能系统、Enhanced Input输入控制等核心功能,大幅缩短开发周期。通过替换角色模型、调整武器数值和配置新地图规则,开发者可在48小时内完成科幻团队竞技游戏原型的搭建。

weixin_28717411的博客 456

缓冲区溢出漏洞深度解析:从原理到实战修复的5种高危模式

缓冲区溢出是计算机安全领域最经典且持续存在的内存破坏漏洞。其核心原理在于程序向预分配的内存区域写入数据时,未进行有效的边界检查,导致数据溢出到相邻内存区域,从而可能覆盖关键的控制数据(如函数返回地址)。这种底层内存管理机制的缺陷,使得攻击者能够劫持程序执行流程,实现任意代码执行,对系统安全构成极高威胁。在软件开发、嵌入式系统及网络服务等广泛的应用场景中,因编码疏忽或对输入验证不足而引入的此类漏洞屡见不鲜。本文聚焦于【基于堆栈的缓冲区溢出】和【整数溢出】等关键模式,结合工程实践,系统阐述其成因、危害及系统的修

weixin_30448603的博客 430

电子电气架构 --- 整车电源管理

保证启动能力:防止因电池电量耗尽而导致的车辆无法启动,这对于确保车辆在任何时候都能可靠运行至关重要。 延长电池寿命:通过避免电池深度放电,有助于延长其使用寿命,减少更换电池的需求和成本。 提升用户体验:虽然负载被关闭可能会暂时影响舒适度,但通过在必要时自动采取行动,可以减少驾驶员的焦虑和不确定性,提高整体的用户满意度。

Soly_kun的博客 1083

Linux下C语言——内存拷贝函数memcpy/memmove

提到这两个函数,大家 函数原型 void *memcpy(void *dest, const void *src, size_t n); void *memmove(void *dest, const void *src, size_t n);

Mastema 6900

解决Jupyter Notebook中Plotly图表显示问题

摘要:在Jupyter Notebook中使用Plotly绘图时遇到图表无法显示的问题。通过分析发现Python 3.12版本与Jupyter存在兼容性问题。解决方案是将Python降级到3.11版本,重新创建虚拟环境后图表正常显示。这表明版本兼容性对数据可视化工具至关重要,环境配置检查是解决问题的关键步骤。该案例为遇到类似问题的开发者提供了参考方案。

m0_74337424的博客 124

uniapp(微信小程序):实现PDF在线预览+在线预览pdf文件完整示例源码,支持文件来源:服务器pdf外链URL预览、调用后端API接口获取PDF文件流二进制下载及解析打开、上传本地PDF文件预览

uni-app实现PDF预览功能,uniapp微信小程序预览PDF,uniapp开发微信小程序在线预览pdf等文件,uniApp微信小程序实现PDF在线预览,Uniapp app在线预览pdf文件流,微信小程序实现pdf预览(苹果安卓兼容),uniapp-微信小程序 实现pdf外链在线预览,uniapp小程序如何做在线预览pdf功能,uniapp小程序端 实现pdf文件预览,微信小程序(uniapp)PDF预览完整实现方案示例demo源码,uni-app预览PDF,小程序pdf预览插件插件,Uniapp微信

✅ 精选推荐文章 4703

glibc--memcpy源码分析

以下是glibc-2.10.1中memcpy函数的源码 #include #include #include #undef memcpy void * memcpy (dstpp, srcpp, len) void *dstpp; const void *srcpp; size_t len; { unsigned long in

astrotycoon 1万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Linux代码拷贝到内存,Linux下C语言——内存拷贝函数memcpy/memmove

终于找了个机会可以写下这两个函数的区别了,不然怕是要忘了,另外,感觉C语言中的小的知识点不要太多,仍需要自己不断地编程,不断地去发掘、、、1. 函数介绍说到memcpy()和memmove()这两个函数,可能大家从名称上认为二者是两个不同的函数。其实不然,事实上,这两个函数功能是类似的,都是对内存进行拷贝(千万不要被memmove()函数中的move给欺骗了,不要想当然的认为它就是移动),二者的区...

weixin_27037521的博客 876

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

linux fork 内存拷贝,关于fork函数中的内存复制和共享,fork函数内存共享

关于fork函数中的内存复制和共享,fork函数内存共享原来刚刚开始做linux下面的多进程编程的时候,对于下面这段代码感到很奇怪,1 #include2 #include3 #include4 #include5 #include6 #include7 #define LEN 28 void err_exit(char *fmt,...);9 int main(int argc,char *ar...

weixin_28289089的博客 614

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

memcpy源代码实现

memcpy 的原理就是将 __src指针指向的数据一个字节一个字节的赋值给 __dest。,不管多复杂的数据结构存储的数据都是字节的倍数。

h799710的博客 2371

linux库函数实现复制文件,linux应用编程笔记(6)库函数方式实现文件复制编程...

摘要:介绍了库函数文件编程常用的函数,打开,关闭,写,读,定位等,最后通过一个实例将这些函数都运用了一边,加深理解。一、库函数文件编程常用函数1.fopen(打开文件)头文件 #include定义函数 FILE * fopen(const char * path,const char * mode);函数说明 参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态。mod...

weixin_27437725的博客 1090
上一篇: C++ 中wchar_t范围来判断其是否是中文,数字还是其他
下一篇: MFC CObject简析
普通网友
博客等级 码龄14年 9粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值