C C++中 memset memcpy 的作用

围巾🧣 2024年12月18日 104次浏览

在C/C++中,memsetmemcpy是两个用于直接操作内存的基础函数,通常用于处理原始数据块。以下是它们的详细说明和用法:


memset 的作用

  1. 功能:将指定内存区域的前 n 个字节设置为特定值。

  2. 原型

    void *memset(void *ptr, int value, size_t num);
    
    • ptr:指向要填充的内存起始地址。
    • value:填充的值(以 int 形式传递,但实际按 unsigned char 处理)。
    • num:填充的字节数。
  3. 用途

    • 初始化内存块(如将数组清零)。
    • 设置特定字节模式(如将缓冲区填充为 0xFF)。
  4. 示例

    char buffer[100];
    memset(buffer, 0, sizeof(buffer)); // 清零整个数组
    
    int arr[10];
    memset(arr, 0x00, sizeof(arr));    // 每个字节设为0,等价于数组初始化为0
    

注意value 的范围是 0x000xFF(单字节)。若用于非字符类型(如 int 数组)填充非零值可能导致意外结果(如 memset(arr, 1, sizeof(arr)) 会使每个 int 的字节变为 0x01010101)。


memcpy 的作用

  1. 功能:将源内存区域的内容复制到目标内存区域,要求源和目标不重叠

  2. 原型

    void *memcpy(void *dest, const void *src, size_t num);
    
    • dest:目标内存地址。
    • src:源内存地址。
    • num:复制的字节数。
  3. 用途

    • 高效拷贝数据块(如数组、结构体)。
    • 处理二进制数据(如网络传输前的内存复制)。
  4. 示例

    int src[5] = {1, 2, 3, 4, 5};
    int dest[5];
    memcpy(dest, src, sizeof(src));    // 复制整个数组
    

注意

  • 若源和目标内存有重叠,应使用 memmove 代替(memmove 能正确处理重叠区域)。
  • 在C++中,对非POD(Plain Old Data)类型(如含虚函数的类)使用 memcpy 可能导致未定义行为。

C与C++的区别

  • 头文件
    • C中需包含 <string.h>
    • C++中建议使用 <cstring>,函数位于 std 命名空间。
  • C++替代方案
    • 优先使用 std::copystd::fill 等类型安全的STL算法。
    • 仅对POD类型(如基本类型、无虚函数的结构体)使用 memset/memcpy

总结

函数 用途 注意事项
memset 填充内存块为特定字节值 仅操作单字节,避免用于非字符类型
memcpy 复制不重叠的内存块 确保无内存重叠,否则用 memmove

在C++中,优先使用类型安全的替代方案(如 std::copy),仅在处理原始内存或POD类型时使用 memsetmemcpy