文章目录
- 前言
- [一、memcpy ------ 基础内存拷贝](#一、memcpy —— 基础内存拷贝)
- [二、memmove ------ 支持重叠的安全内存拷贝](#二、memmove —— 支持重叠的安全内存拷贝)
- [三、memset ------ 内存批量初始化](#三、memset —— 内存批量初始化)
- [四、memcmp ------ 内存字节级比较](#四、memcmp —— 内存字节级比较)
- 五、四大内存函数总结对比
- 六、关键注意事项
- 总结
前言
在 C 语言编程中,内存操作 是核心技能之一。不同于字符串函数仅针对字符处理,内存函数可以操作任意类型数据,以字节为单位读写内存,是实现高效数据拷贝、初始化、比较的关键工具。
本文将系统讲解 C 语言四大内存函数:memcpy、memmove、memset、memcmp,包含函数用法、核心特性、代码示例与模拟实现,帮你彻底掌握内存操作逻辑。
一、memcpy ------ 基础内存拷贝
1.函数原型
c
void *memcpy(void *destination, const void *source, size_t num);
2.核心特性
- 从 source 起始位置,拷贝 num 字节数据到 destination 内存地址
- 遇到 \0 不会停止,不受字符串结束符限制
- 不支持内存重叠,重叠拷贝结果未定义
- 适用于任意数据类型(int、float、结构体等)
3.使用示例
c
#include <stdio.h>
#include <string.h>
int main()
{
int arr1[] = {1,2,3,4,5,6,7,8,9,10};
int arr2[10] = {0};
// 拷贝 20 字节 = 5 个 int 类型数据
memcpy(arr2, arr1, 20);
for (int i = 0; i < 10; i++)
{
printf("%d ", arr2[i]);
}
return 0;
}
输出结果:1 2 3 4 5 0 0 0 0 0
4.模拟实现
c
#include <assert.h>
void * my_memcpy ( void * dst, const void * src, size_t count)
{
void * ret = dst;
// 断言保证指针有效
assert(dst && src);
while (count--) {
// 强转为char*,逐字节拷贝
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}
return ret;
}
二、memmove ------ 支持重叠的安全内存拷贝
1.函数原型
c
void *memmove(void *destination, const void *source, size_t num);
2.核心特性
- 功能与 memcpy 一致,唯一区别:支持内存重叠
- 内存重叠场景下,必须使用 memmove 保证结果正确
- 拷贝逻辑:

3.使用示例
c
#include <stdio.h>
#include <string.h>
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
// 内存重叠:arr1+2 与 arr1 地址重叠
memmove(arr1+2, arr1, 20);
for (int i = 0; i < 10; i++)
{
printf("%d ", arr1[i]);
}
return 0;
}
输出结果:1 2 1 2 3 4 5 8 9 10
4.模拟实现
c
#include <assert.h>
void * my_memmove ( void * dst, const void * src, size_t count)
{
void * ret = dst;
assert(dst && src);
// 无重叠:从前向后拷贝
if (dst <= src || (char *)dst >= ((char *)src + count)) {
while (count--) {
*(char *)dst = *(char *)src;
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;
}
三、memset ------ 内存批量初始化
1.函数原型
c
void * memset ( void * ptr, int value, size_t num );
2.核心特性
- 以字节为单位填充内存,批量设置数据(与char很对应)
- 常用于数组、结构体的初始化(清零 / 置值)
- 注意:对 int 类型赋值非 0 值会出错(逐字节覆盖,且int类型存入内存的是补码)
3.使用示例
c
#include <stdio.h>
#include <string.h>
int main ()
{
char str[] = "hello world";
// 前6个字节替换为'x'
memset (str,'x',6);
printf("%s\n", str);
return 0;
}
输出结果:xxxxxxworld
四、memcmp ------ 内存字节级比较
1.函数原型
c
int memcmp ( const void * ptr1, const void * ptr2, size_t num );
2.核心特性
- 比较ptr1和ptr2起始位置的num字节内存
- 逐字节比较,按无符号 char判断大小(1个字节大小)
- 返回值规则:
返回小于0的值:ptr1 < ptr2
返回0:ptr1 == ptr2
返回大于0的值:ptr1 > ptr2
3.使用示例
#include <stdio.h>
#include <string.h>
c
int main()
{
char buffer1[] = "DWgaOtP12df0";
char buffer2[] = "DWGAOTP12DF0";
int n = memcmp(buffer1, buffer2, sizeof(buffer1));
if (n > 0)
printf("'%s' 大于 '%s'.\n", buffer1, buffer2);
else if (n < 0)
printf("'%s' 小于 '%s'.\n", buffer1, buffer2);
else
printf("'%s' 等于 '%s'.\n", buffer1, buffer2);
return 0;
}
五、四大内存函数总结对比
| 函数 | 功能 | 内存重叠 | 操作单位 | 核心场景 |
|---|---|---|---|---|
| memcpy | 内存拷贝 | 不支持 | 字节 | 无重叠数据拷贝 |
| memmove | 内存拷贝 | 支持 | 字节 | 重叠 / 无重叠通用 |
| memset | 内存初始化 | - | 字节 | 清零、批量置值 |
| memcmp | 内存比较 | - | 字节 | 任意类型数据比较 |
六、关键注意事项
- 内存函数均依赖<string.h>头文件
- 操作以字节为单位,与数据类型无关
- 重叠拷贝必须用memmove,避免未定义行为
- memset对 int 类型仅推荐用于清零
总结
掌握 C 语言内存函数,是进阶编程的必经之路。无论是底层开发、数据结构还是性能优化,灵活使用memcpy/memmove/memset/memcmp,能让你的代码更简洁、高效、安全。
以上就是该篇博客的内容了,如果内容存在不足,请大佬多多包涵并不吝赐教,会在写出优秀好文的路上努力拼搏达,感谢支持!!!
一键三连。[1](#1)感谢佬们的支持😄
- 点赞,关注,收藏qwq感谢佬佬们 ↩︎