在C/C++中,memset
和memcpy
是两个用于直接操作内存的基础函数,通常用于处理原始数据块。以下是它们的详细说明和用法:
memset
的作用
-
功能:将指定内存区域的前
n
个字节设置为特定值。 -
原型:
void *memset(void *ptr, int value, size_t num);
ptr
:指向要填充的内存起始地址。value
:填充的值(以int
形式传递,但实际按unsigned char
处理)。num
:填充的字节数。
-
用途:
- 初始化内存块(如将数组清零)。
- 设置特定字节模式(如将缓冲区填充为
0xFF
)。
-
示例:
char buffer[100]; memset(buffer, 0, sizeof(buffer)); // 清零整个数组
int arr[10]; memset(arr, 0x00, sizeof(arr)); // 每个字节设为0,等价于数组初始化为0
注意:value
的范围是 0x00
到 0xFF
(单字节)。若用于非字符类型(如 int
数组)填充非零值可能导致意外结果(如 memset(arr, 1, sizeof(arr))
会使每个 int
的字节变为 0x01010101
)。
memcpy
的作用
-
功能:将源内存区域的内容复制到目标内存区域,要求源和目标不重叠。
-
原型:
void *memcpy(void *dest, const void *src, size_t num);
dest
:目标内存地址。src
:源内存地址。num
:复制的字节数。
-
用途:
- 高效拷贝数据块(如数组、结构体)。
- 处理二进制数据(如网络传输前的内存复制)。
-
示例:
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中需包含
- C++替代方案:
- 优先使用
std::copy
、std::fill
等类型安全的STL算法。 - 仅对POD类型(如基本类型、无虚函数的结构体)使用
memset
/memcpy
。
- 优先使用
总结
函数 | 用途 | 注意事项 |
---|---|---|
memset |
填充内存块为特定字节值 | 仅操作单字节,避免用于非字符类型 |
memcpy |
复制不重叠的内存块 | 确保无内存重叠,否则用 memmove |
在C++中,优先使用类型安全的替代方案(如 std::copy
),仅在处理原始内存或POD类型时使用 memset
和 memcpy
。