memcpy 使用指南 (C语言)
memcpy
是 C 语言标准库中的一个重要函数,用于在内存区域之间复制数据。它是 <string.h>
头文件中定义的高效内存操作函数之一。
函数原型
void *memcpy(void *dest, const void *src, size_t n);
参数说明
-
dest
: 目标内存地址,数据将被复制到这里 -
src
: 源内存地址,数据从这里复制 -
n
: 要复制的字节数
返回值
返回目标内存地址 dest
的指针。
基本用法
#include <stdio.h>
#include <string.h>int main() {char src[] = "Hello, World!";char dest[20];// 复制 src 的内容到 destmemcpy(dest, src, strlen(src) + 1); // +1 是为了包含字符串结束符 '\0'printf("源字符串: %s\n", src);printf("目标字符串: %s\n", dest);return 0;
}
重要注意事项
-
内存重叠问题:
-
memcpy
不处理内存重叠的情况。如果源和目标内存区域重叠,行为是未定义的。 -
对于重叠内存区域,应该使用
memmove
函数。
-
-
边界检查:
-
必须确保目标缓冲区足够大,以避免缓冲区溢出。
-
-
类型无关:
-
memcpy
可以用于任何数据类型,因为它按字节操作。
-
结构体复制示例
#include <stdio.h>
#include <string.h>typedef struct {int id;char name[20];float score;
} Student;int main() {Student s1 = {1, "Alice", 95.5};Student s2;// 复制结构体memcpy(&s2, &s1, sizeof(Student));printf("学生ID: %d\n", s2.id);printf("学生姓名: %s\n", s2.name);printf("学生成绩: %.1f\n", s2.score);return 0;
}
性能考虑
memcpy
通常经过高度优化,比手动编写的循环复制要快得多,特别是对于大块数据。
与 strcpy 的区别
-
strcpy
用于以 null 结尾的字符串,遇到 '\0' 停止复制 -
memcpy
严格按指定的字节数复制,不考虑任何终止符
安全替代品
在一些安全敏感的编程环境中,可以考虑使用更安全的版本:
-
memcpy_s
(C11 标准) -
或者自己实现带有边界检查的版本