1. 内存操作函数概述
在C语言开发中,内存操作是最基础也是最核心的技能之一。与字符串处理函数不同,mem系列函数能够处理任意类型的内存数据,包括结构体、数组等二进制数据。这些函数直接操作内存字节,不受数据类型限制,为底层开发提供了极大灵活性。
注意:所有mem系列函数都定义在<string.h>头文件中,使用前必须包含该头文件
内存操作函数与字符串函数的本质区别在于:
- 字符串函数遇到'\0'终止符就会停止操作
- 内存操作函数严格按指定字节数操作,不考虑数据内容
- 内存函数可以处理包含'\0'的二进制数据
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. memcpy函数深度解析
2.1 函数原型与参数说明
c复制void *memcpy(void *dest, const void *src, size_t n);
参数解析:
- dest:目标内存起始地址,类型为void*可接受任意指针
- src:源内存起始地址,const修饰保证不被修改
- n:要复制的字节数,size_t类型保证足够大
返回值:
- 返回目标内存指针dest,支持链式调用
2.2 典型应用场景
- 数组复制
c复制int src[5] = {1,2,3,4,5};
int dest[5];
memcpy(dest, src, sizeof(src));
- 结构体复制
c复制typedef struct {
int id;
char name[20];
} Student;
Student s1 = {101, "Alice"};
Student s2;
memcpy(&s2, &s1, sizeof(Student));
- 内存块拷贝
c复制void *buffer = malloc(1024);
void *backup = malloc(1024);
memcpy(backup, buffer, 1024);
2.3 边界条件与陷阱
- 缓冲区溢出风险
c复制char src[10] = "123456789";
char dest[5];
memcpy(dest, src, 10); // 危险!dest只有5字节
- 内存重叠问题
c复制char str[10] = "abcdef";
memcpy(str+2, str, 4); // 未定义行为
- 空指针检查
c复制if(dest == NULL || src == NULL) {
// 必须进行空指针检查
}
2.4 性能优化技巧
- 按机器字长拷贝
c复制// 32位系统优化示例
void *fast_memcpy(void *dest, const void *src, size_t n) {
uint32_t *d32 = (uint32_t*)dest;
uint32_t *s32 = (uint32_t*)src;
while(n >= 4) {
*d32++ = *s32++;
n -= 4;
}
// 处理剩余字节
char *d = (char*)d32;
char *s = (char*)s32;
while(n--) {
*d++ = *s++;
}
return dest;
}
- 内存对齐处理
c复制// 确保地址对齐后再进行批量拷贝
if(((uintptr_t)dest & 0x3) == 0 && ((uintptr_t)src & 0x3) == 0) {
// 对齐情况下使用优化版本
} else {
// 非对齐情况使用逐字节拷贝
}
