memcpy() -- 拷贝内存内容

本文介绍了memcpy()函数的基本用法及特点。memcpy()用于将源地址src的前n个字节复制到目标地址dest中,与strcpy()不同的是,它会完全复制指定长度的内容。文章通过示例展示了如何使用memcpy()来替代部分字符串处理函数。
memcpy() -- 拷贝内存内容
2007年07月06日 星期五 09:07
相关函数: bcopy(), memccpy(), memmove(), strcpy(), strncpy()
表头文件: #include <string.h>
定义函数: void *memcpy(void *dest, const void *src, size_t n)
函数说明: memcpy()用来拷贝src所指的内存内容前n个字节到dest所指的内存地址上。与strcpy()不同的是,memcpy()会完整的复制n个字节,不会因为遇到字符串结束'/0'而结束
返回值:   返回指向dest的指针
附加说明: 指针src和dest所指的内存区域不可重叠



-------------------------------------------------------
#include <string.h>
#include <stdio.h>

int main()
{
    char a[30] = "string (a)";
    char b[30] = "hi/0zengxiaolong";
    int i;

    strcpy(a, b);             //a[30] = "hi/0ing (a)"
    printf("strcpy():");
    for(i = 0; i < 30; i++)
        printf("%c", a[i]);   //hi ing (a)


    memcpy(a, b, 30);         //a[30] = "hi/0zengxiaolong"
    printf("/nmemcpy():");
    for(i = 0; i < 30; i++)
        printf("%c", a[i]);   //hi zengxiaolong
    printf("/n i = %d/n", i); //30

是的,`memcpy` 是 C 标准库中的一个函数,**它确实是直接拷贝内存**,用于将一段内存中的数据原样复制到另一段内存中,不进行任何类型检查或解释。 --- ### 一、`memcpy` 的原型和作用 ```c void *memcpy(void *dest, const void *src, size_t n); ``` - `dest`:目标内存地址 - `src`:源内存地址 - `n`:要复制的字节数 #### 作用: - 将从 `src` 开始的 `n` 字节的内存内容,**逐字节复制**到 `dest` 开始的内存区域。 - **不检查内容,不处理结构体逻辑,只是纯粹的内存拷贝。** --- ### 二、`memcpy` 是如何工作的? `memcpy` 的实现本质上是**逐字节或逐块复制内存内容**。在大多数现代实现中,为了提高性能,会使用以下优化: 1. **按字(word)或双字(double word)拷贝**:使用 CPU 支持的更宽的数据总线来提高效率。 2. **对齐处理**:如果源和目标地址是内存对齐的,可以更快地复制。 3. **特殊指令优化**:如使用 SSE/AVX 指令(x86)或 NEON(ARM)等 SIMD 指令加速。 #### 简化版 `memcpy` 实现(仅作理解): ```c void *memcpy(void *dest, const void *src, size_t n) { char *d = dest; const char *s = src; while (n--) { *d++ = *s++; } return dest; } ``` --- ### 三、为什么说 `memcpy` 是“直接”拷贝- **直接访问内存地址**:你传入的是两个内存地址,它不关心这两个地址上存放的是什么类型的数据。 - **不做类型检查或结构体解析**:例如复制一个 `struct`、`int[]`、`char*` 都是一样的处理方式。 - **不考虑内存重叠问题**:如果你复制的内存区域有重叠,应该使用 `memmove` 而不是 `memcpy`。 --- ### 四、使用 `memcpy` 的注意事项 | 问题 | 说明 | |------|------| | **内存重叠** | `memcpy` 不处理内存重叠,使用 `memmove` 更安全 | | **对齐问题** | 某些架构(如 ARM)对未对齐访问支持差,使用不当会触发异常 | | **空指针或非法地址** | 传入 NULL 或非法地址会导致未定义行为(崩溃) | | **用户空间地址** | 在内核中使用 `memcpy` 拷贝用户空间地址是危险的,应使用 `copy_from_user` | --- ### 五、使用示例 #### 示例 1:拷贝基本类型数组 ```c int src[] = {1, 2, 3, 4, 5}; int dest[5]; memcpy(dest, src, sizeof(src)); ``` #### 示例 2:拷贝结构体 ```c typedef struct { int id; char name[20]; } Person; Person p1 = {1, "Alice"}; Person p2; memcpy(&p2, &p1, sizeof(Person)); ``` --- ### 六、总结 | 特性 | `memcpy` | |------|----------| | 是否直接拷贝内存 | ✅ 是 | | 是否检查类型 | ❌ 否 | | 是否处理内存重叠 | ❌ 否 | | 是否适合内核使用用户空间指针 | ❌ 否 | | 是否高效 | ✅ 是,现代实现非常高效 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值