函数的基本概念
核心功能:快速将内存块的每个字节设为指定值,常用于初始化内存或清空缓冲区。
函数原型:
void *memset(void *ptr, int value, size_t num);
ptr
:目标内存的起始地址(如数组、结构体指针)。- 必须可写,否则程序崩溃!
value
:要设置的值(范围:0~255)。- 超出范围时,取低 8 位(如
300
→300%256=44
)。
- 超出范围时,取低 8 位(如
num
:填充的字节数(不是元素个数!)。- 例:
int arr[10]
→ 总字节数 =10 * sizeof(int)
。
- 例:
返回值:返回原始指针 ptr
,便于链式调用(如直接传给其他函数)。
使用示例
1)清零内存
int arr[100];
memset(arr, 0, sizeof(arr)); // 所有字节设为 0 (int类型 设为1是错误的)
2)初始化结构体
struct Data data;
memset(&data, 0, sizeof(data)); // 清空结构体
避坑指南
1)不要给整数/浮点数设置非0值
核心问题:memset
按字节填充,破坏多字节类型的内存结构!
// 错误示例
int arr[10];
memset(arr, 1, sizeof(arr)); // 每个字节设为1 → int值变成0x01010101(不是1!)
解决方案:
- 清零内存(全0)安全;
memset(arr, 0, sizeof(arr)); // 全0对所有类型有效
- 设置非0值 → 用循环逐元素赋值;
for (int i=0; i<10; i++) arr[i] = 1; // int设为1
2)内存越界必崩溃
char buffer[10];
memset(buffer, 0, 20); // 越界写20字节(buffer只有10字节)
安全做法:用sizeof
自动计算;memset(buffer, 0, sizeof(buffer)); // 精确填充
总结:memset
按字节批量赋值,适合快速初始化字符数组或清零内存;避免用于非字符类型(如int
/float
)的非零赋值和越界操作,否则导致数值异常或程序崩溃!