memset函数

张开发
2026/5/18 9:27:15 15 分钟阅读
memset函数
memset是 C 标准库中用于将一块内存的每个字节都设置为指定值的函数定义在string.h头文件中。它通常用于初始化数组或结构体将内存区域快速清零或填充特定字节。1. 函数原型#includestring.hvoid*memset(void*s,intc,size_tn);s指向要填充的内存区域的指针通常是数组或结构体。c要设置的值以int传入但实际只取其低 8 位即一个字节的值。n要填充的字节数通常用sizeof计算。返回值返回指向s的指针便于链式调用。2. 常见用法2.1 将数组清零intarr[10];memset(arr,0,sizeof(arr));// 所有字节设为 0即每个 int 元素变为 02.2 初始化字符数组charstr[100];memset(str,A,50);// 前 50 个字节设为 A2.3 清空结构体structStudentstu;memset(stu,0,sizeof(stu));// 所有成员清零包括填充字节2.4 结合动态内存int*pmalloc(10*sizeof(int));if(p)memset(p,0,10*sizeof(int));// 清零后使用free(p);3. 注意事项3.1 字节级操作memset按字节设置因此c会被当作无符号字符使用。例如inta[5];memset(a,1,sizeof(a));// 每个字节设为 1最终每个 int 的值是 0x01010101约 16843009而非 1若要设置整型数组的每个元素为 1应使用循环或for赋值。3.2 对非字符类型需谨慎只有将c设为 0 时才能保证所有类型int、float、指针等都得到“零”值对于浮点全 0 表示 0.0对于指针全 0 表示空指针。对于其他值如 1对非字符类型的结果通常不是预期的。3.3 长度参数n通常用sizeof计算目标对象的字节数确保不越界。intarr[10];memset(arr,0,10*sizeof(int));// 正确memset(arr,0,10);// 错误只设置了前 10 字节而不是 10 个 int3.4 性能memset通常由编译器高度优化可能使用 SIMD 指令或块复制比手动循环快得多适合大块内存初始化。3.5 与bzero的关系bzero是 BSD 中的非标准函数清零但在 POSIX 和 C 标准中推荐使用memset。4. 示例清零结构体#includestdio.h#includestring.htypedefstruct{intid;charname[20];floatscore;}Student;intmain(){Student stu;memset(stu,0,sizeof(stu));// 所有字节清零printf(id%d, name[0]%d, score%f\n,stu.id,stu.name[0],stu.score);// 输出id0, name[0]0, score0.000000return0;}总结memset是高效的内存填充函数按字节设置。最常用于清零内存c0也可用于填充字符数组。对于非字符类型的初始化一般仅当c0时才安全得到正确零值。使用时注意长度参数避免越界或意外结果。

更多文章