ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

C 语言内存函数超清晰总结(memcpy、memmove、memcmp、memset)

C 语言内存函数超清晰总结(memcpy、memmove、memcmp、memset)

前言:

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。

模拟实现:

六、一张表总结

表格:

七、面试必问

  1. memcpy 和 memmove 区别?
    memcpy 不处理重叠, memmove 处理。

  2. memset 能直接把 int 数组设为 1 吗?
    不能,它是按字节赋值。

  3. 内存函数和字符串函数区别?
    字符串函数遇到 \0 停止;内存函数按字节数走。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进