在 C 语言编程中,内存操作是核心环节之一,memcpy、memmove、memset和memcmp这四个函数直接作用于内存字节,不依赖数据类型,灵活性极高,但也因操作底层内存,若使用不当易引发内存越界、数据污染等问题。本文将从函数定义、使用场景、实现原理到避坑指南,全方位解析这四个函数,帮你彻底掌握内存操作的精髓。
一、内存拷贝:memcpy
memcpy的核心功能是从源内存地址拷贝指定字节数的数据到目标内存地址,是最常用的内存拷贝函数,头文件为<string.h>。
1.1 函数原型与参数解析
void *memcpy(void *dest, const void *src, size_t n);
- dest:目标内存地址(需确保可写,且足够大以容纳n字节数据)。
- src:源内存地址(用const修饰,表明函数不会修改源数据,提高安全性)。
- n:要拷贝的字节数(size_t是无符号整数类型,避免负数传入)。
- 返回值:返回dest的地址(方便链式调用,如printf("%s", memcpy(buf, "hello", 5)))。
1.2 核心特性与使用场景
- 特性:按字节拷贝,不关心数据类型(无论是int、float还是自定义结构体,都能直接拷贝);但不处理源地址和目标地址重叠的情况(若重叠,可能导致数据拷贝错误)。
- 使用场景:非重叠内存区域的数据拷贝,如数组拷贝、结构体赋值、内存块备份等。
1.3 实例演示:用 memcpy 拷贝数组与结构体
示例 1:拷贝 int 数组
#include <stdio.h>
#include <string.h>
int main() {
int src_arr[5] = {1, 2, 3, 4, 5};
int dest_arr[5] = {0}; // 目标数组初始化为0
// 拷贝5个int元素,每个int占4字节,共5×4=20字节
memcpy(dest_arr, src_arr, sizeof(src_arr));
printf("目标数组:");
for (int i = 0; i < 5; i++) {
printf("%d ", dest_arr[i]); // 输出:1 2 3 4 5
}
return 0;
}
示例 2:拷贝结构体
#include <stdio.h>
#include <string.h>
struct Student {
char name[20];
int age;
float score;
};
int main() {
struct Student src_stu = {"Zhang San", 20, 95.5};
struct Student dest_stu;
// 拷贝整个结构体,字节数为结构体大小
memcpy(&dest_stu, &src_stu, sizeof(struct Student));
print

最低0.47元/天 解锁文章
864

被折叠的 条评论
为什么被折叠?



