当前位置: 首页 > news >正文

memset函数

memset是 C 标准库中用于将一块内存的每个字节都设置为指定值的函数,定义在<string.h>头文件中。它通常用于初始化数组或结构体,将内存区域快速清零或填充特定字节。


1. 函数原型

#include<string.h>void*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 元素变为 0

2.2 初始化字符数组

charstr[100];memset(str,'A',50);// 前 50 个字节设为 'A'

2.3 清空结构体

structStudentstu;memset(&stu,0,sizeof(stu));// 所有成员清零(包括填充字节)

2.4 结合动态内存

int*p=malloc(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 个 int

3.4 性能

memset通常由编译器高度优化,可能使用 SIMD 指令或块复制,比手动循环快得多,适合大块内存初始化。

3.5 与bzero的关系

bzero是 BSD 中的非标准函数(清零),但在 POSIX 和 C 标准中,推荐使用memset


4. 示例:清零结构体

#include<stdio.h>#include<string.h>typedefstruct{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);// 输出:id=0, name[0]=0, score=0.000000return0;}

总结

  • memset是高效的内存填充函数,按字节设置。
  • 最常用于清零内存(c=0),也可用于填充字符数组。
  • 对于非字符类型的初始化,一般仅当c=0时才安全(得到正确零值)。
  • 使用时注意长度参数,避免越界或意外结果。
http://www.jsqmd.com/news/579183/

相关文章:

  • ISO15118-3 解读
  • 嵌入式应用开发与BSP开发的核心差异与职业选择
  • SecGPT-14B知识库:为OpenClaw构建内部安全问答技能
  • 西门子S7-1200路口红绿灯设计与软件简介
  • 数据处理的艺术:Pandas中的字符串操作
  • 电脑磁盘满了怎么办?一文教你安全清理、快速释放空间
  • file_operations结构体:驱动与内核的契约书
  • OpenClaw浏览器自动化:千问3.5-27B驱动智能检索与内容聚合
  • Spring AI 1.1.4 开发者使用手册
  • 轻量级双二阶滤波器库biquadFilter嵌入式实践
  • OpenClaw安全指南:gemma-3-12b-it本地化部署的数据边界管控
  • OpenClaw异常处理:Qwen3.5-9B自动修复失败任务
  • 神马网站 SEO 优化对网站转化率的影响
  • 千问3.5-9B+OpenClaw内容处理:自动生成技术博客草稿
  • 15个实用电脑使用小技巧,零基础也会,效率翻倍、电脑更流畅
  • 关于一些Git的学习
  • 小端走错的路——学会魔搭CLI
  • BilibiliDown终极指南:3步掌握B站视频下载神器
  • 成功在本地部署openclaw,使用本地模型,并可以exec执行任务,tool执行成功
  • 2026年靠谱的医用材料疲劳试验机公司对比推荐 - 品牌宣传支持者
  • 小端火爆计划:我的第一步
  • macOS下OpenClaw一键安装指南:对接千问3.5-35B-A3B-FP8实现本地自动化
  • [具身智能-202]:Visual Studio vs. Visual Studio Code
  • Ubuntu极简安装Conda指南
  • C语言中的对齐(alignment)与#pragma pack
  • 2026年评价高的电池疲劳试验机口碑好的厂家推荐 - 品牌宣传支持者
  • OpenClaw安全防护:Qwen3.5-9B操作权限管理与风险指令拦截
  • 【Linux】库的制作与使用(2)ELF静态链接
  • 什么是精益生产管理八大浪费?精益生产管理八大浪费详解
  • 电机轴承异响?5分钟教你用振动分析仪定位故障(附实测案例)