memcpy 函数的使用与模拟实现
·
目录
一、memcpy 函数概述

memcpy 是 C 语言标准库中的一个内存拷贝函数,其原型如下:
void *memcpy(void *destination, const void *source, size_t num);
函数特性:
-
从
source指向的内存位置开始,向后复制num个字节的数据到destination指向的内存位置 -
该函数不会因为遇到
'\0'而停止复制(与strcpy不同) -
如果
source和destination内存区域有重叠,复制结果是未定义的(行为不可预测,可能会无限循环地执行) -
返回目标内存的起始地址(即
destination的值)
复制内存块
将源地址开始的 num 字节数据直接复制到目标地址。
此函数执行二进制数据拷贝,不考虑源和目标指针的基础数据类型。
函数会严格复制指定字节数,不会检查源数据中的终止空字符。
注意事项:
- 为避免溢出,源和目标数组的大小至少应为 num 字节
- 源和目标内存块不应重叠(如需处理重叠内存块,建议使用 memmove 函数)
二、memcpy 使用示例
#include <stdio.h>
#include <string.h>
int main()
{
int arr1[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int arr2[10] = {0};
// 复制 arr1 的前 20 个字节(即前 5 个 int 元素)到 arr2
memcpy(arr2, arr1, 20);
// 输出 arr2 的内容
for (int i = 0; i < 10; i++)
{
printf("%d ", arr2[i]);
}
return 0;
}
输出结果:

三、注意事项
对于重叠的内存区域(即源地址和目标地址有重叠的情况),应该使用 memmove 函数而非 memcpy。memmove 会处理重叠情况,保证复制结果正确。(后续会讲解,不急,先知道先)
四、memcpy 的模拟实现
以下是 memcpy 函数的一个模拟实现:
#include <assert.h>
void *my_memcpy(void *dst, const void *src, size_t count)
{
void *ret = dst; // 保存目标地址用于返回
// 检查参数有效性
assert(dst != NULL);
assert(src != NULL);
// 逐字节从低地址向高地址复制
while (count--) {
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}
return ret; // 返回目标内存起始地址
}
使用上面的使用实例可以看到可以完成内存拷贝功能:

实现说明:
-
使用
assert确保目标地址和源地址非空 -
将
void*指针转换为char*以实现逐字节复制 -
按从低地址到高地址的顺序复制数据
-
返回原始的目标地址,与标准库行为一致
限制:
-
此实现不处理内存重叠情况
-
实际标准库实现可能会使用更高效的块复制方式(如一次复制 4 或 8 字节)
这个模拟实现帮助我们理解 memcpy 的基本工作原理,但在实际开发中应优先使用标准库的实现。
更多推荐



所有评论(0)