在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。