前言:
C 语言中, strcpy / strcmp 等字符串函数只能处理字符串。
想要通用拷贝任意类型数组、结构体,就要用内存操作函数:按字节操作,不关心数据类型。
本文一次性讲清 4 个常用内存函数:用法 + 区别 + 模拟实现(面试常考)。
一、4 个内存函数总览( #include <string.h> )
memcpy 内存拷贝(不处理重叠)
memmove 内存拷贝(处理重叠,更安全)
memcmp 内存比较
memset 内存赋值(按字节)
二、memcpy — 不重叠内存拷贝
作用:从 src 拷贝 num 字节到 dest 。
特点:
按字节拷贝,任意类型都能用
不处理内存重叠
遇到 \0 不停止
模拟实现(极简版):
三、memmove — 处理重叠的安全拷贝
和 memcpy 用法完全一样。
区别:能处理内存重叠。
什么时候重叠?
同个数组内部拷贝,比如:
用 memcpy 可能数据被覆盖, memmove 一定安全。
模拟实现(核心:判断方向):
四、memcmp — 内存比较
比较前 num 个字节
返回值:
<0:ptr1 < ptr2
=0:相等
0:ptr1 > ptr2
模拟实现:
五、memset — 内存初始化
作用:把 ptr 前 num 字节逐字节设为 value。
最常见坑:
结果是 0x01010101 ,不是 1。
模拟实现:
六、一张表总结
表格:
七、面试必问
memcpy 和 memmove 区别?
memcpy 不处理重叠, memmove 处理。memset 能直接把 int 数组设为 1 吗?
不能,它是按字节赋值。内存函数和字符串函数区别?
字符串函数遇到 \0 停止;内存函数按字节数走。