嵌入式Linux系统编程 — 4.4 memset、bzero函数内存填充

目录

1 memset 函数

2  bzero函数


在编程中,经常需要将某一块内存中的数据全部设置为指定的值,譬如在定义数组、结构体这种类型变量时,通常需要对其进行初始化操作,而初始化操作一般都是将其占用的内存空间全部填充为 0。

1 memset 函数

memset 函数是C语言标准库中的一个函数,用于将一块内存中的所有字节设置为特定的值。这通常用于初始化一个数组或结构体为零值,或者在释放内存前清除敏感数据。函数原型如下:

void *memset(void *s, int c, size_t n);
  • s:指向要填充的内存块的指针。
  • c:要设置的值,通常用整数的ASCII码表示字符,例如 '0' 表示 ASCII 码为 48 的字符。
  • n:要设置的字节数。

memset 函数常用于以下几种情况:

  1. 初始化数组或结构体为零:memset(&myStruct, 0, sizeof(myStruct));
  2. 清除敏感数据:例如在释放包含密码的内存前,使用 memset 来覆盖数据。
  3. 创建具有特定填充字符的字符串数组:memset(buffer, ' ', sizeof(buffer));

下面的示例程序提示输入一个字符串,然后输入一个用于填充的字符 c 和要填充的字节数 n。程序将使用 memset 函数来填充字符串之后的内存,并打印出填充后的字符串。

#include <stdio.h>
#include <string.h>#define MAX_STR_LEN 100 // 定义字符串的最大长度int main() 
{char str[MAX_STR_LEN]; // 存储用户输入的字符串char fillChar; // 存储用户输入的填充字符int n; // 存储用户输入的字节数// 获取用户输入的字符串printf("请输入一个字符串:");fgets(str, MAX_STR_LEN, stdin); // 使用fgets读取一行输入,包括空格// 去除可能读取的换行符str[strcspn(str, "\n")] = 0;// 获取用户输入的填充字符printf("请输入一个用于填充的字符:");scanf("%c", &fillChar); // 读取一个字符// 获取用户输入的字节数printf("请输入要填充的字节数:");scanf("%d", &n); // 读取一个整数// 确保n不大于字符串的最大长度n = n > MAX_STR_LEN ? MAX_STR_LEN : n;// 使用memset函数从字符串末尾开始向前填充n个字节memset(str + strlen(str), fillChar, n);// 打印填充后的字符串printf("填充后的字符串: %s\n", str);return 0;
}

程序运行的结果如下:

2 bzero函数

bzero 函数用于将一块内存区域的内容设置为零。它属于 BSD 系统调用,可能在某些系统上不可用或已被弃用,特别是在 POSIX 标准中,它已被 memset 函数取代。函数原型如下:

void bzero(void *s, size_t n);
  • s:指向要清零的内存块的指针。
  • n:要清零的字节数。
#include <stdio.h>
#include <string.h>
#include <strings.h> // 包含bzero函数的头文件#define MAX_STR_LEN 100 // 定义字符串的最大长度int main() 
{char str[MAX_STR_LEN]; // 存储用户输入的字符串// 获取用户输入的字符串printf("请输入一个字符串:");fgets(str, MAX_STR_LEN, stdin); // 使用fgets读取一行输入,包括空格// 去除可能读取的换行符str[strcspn(str, "\n")] = 0;// 使用bzero函数从字符串的开始位置清零n个字节bzero(str, sizeof(str));// 打印清零后的字符串// 注意:清零后的字符串可能不是有效的C字符串,因为它可能不以'\0'结尾printf("清零后的字符串: %s\n", str);return 0;
}

代码提示用户输入一个字符串,并使用 fgets 函数读取用户输入,包括空格,然后去除末尾的换行符。接着,使用 bzero 函数将整个字符串数组 str 清零,这会覆盖字符串数组的每个字节为 0,导致字符串不再是有效的C字符串,因为它不再以空字符 '\0' 结尾。最后,尽管可能不是有效的字符串,程序仍尝试打印整个字符串数组的内容。 程序运行结果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/862315.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Pytorch课程论文设计参考

Pytorch下基于卷积神经网络的手写数字识别 论文格式 利用wps初步美化论文格式教程 wps论文格式变的的原因 格式变的根本原因是word为流式文件&#xff0c;就算同是word同一个版本不同电脑也会有可能变&#xff0c;字体变是因为没有嵌入字体然后观看的那台没有这个字体。 一、…

Redis和PHP的Bitmap于二进制串的相互转换

Redis和PHP的Bitmap于二进制串的相互转换 场景 错题集的存储&#xff0c;需要有正确的题号id集合&#xff0c;错误的题号id集合&#xff0c;两者并集后在全量题的集合中取反就是未答题号id 选型 基于场景的数据结构设计&#xff0c;有试过列表等&#xff0c;测试结果&#xff1…

confluence集成LDAP

一、confluence的权限管理 在集成前&#xff0c;我们必须得知道confluence自身的权限管理是如何做的。 用户组对应空间权限&#xff0c;用户组可以是一个项目&#xff0c;也可以是一个部门或组。 一个用户组里的用户&#xff0c;可以读写本空间的页面&#xff0c;而把其他组隔离…

力扣随机一题 6/28 数组/矩阵

&#x1f4dd;个人主页&#x1f339;&#xff1a;誓则盟约⏩收录专栏⏪&#xff1a;IT 竞赛&#x1f921;往期回顾&#x1f921;&#xff1a;6/27 每日一题关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d…

真实案例解析!企业如何做好安全生产管理工作?

很多企业都有相对应的安全管理制度&#xff0c;安全管理系统&#xff0c;安全管理人员等等&#xff0c;但这都仅限于企业“做了”安全生产管理&#xff0c;并不能“做好”安全生产管理。其实做好安全生产管理需要安全管理系统的配合。 听说过EHS系统吗&#xff1f;这系统能帮企…

百元平价蓝牙耳机哪款好?揭秘百元高性价比蓝牙耳机推荐

如今&#xff0c;市面上的耳机种类繁多&#xff0c;有线、无线、降噪等功能让人眼花缭乱。而对于那些预算有限、但又希望享受无线便捷和高性价比的朋友们来说&#xff0c;百元左右的蓝牙耳机无疑是一个不错的选择。这类耳机不仅能够提供不错的音质体验&#xff0c;同时价格也十…

安宝特分享 | 数字化革命,AR技术打造智慧城市的未来

随着城市化进程的加速和科技创新的不断推进&#xff0c; AR技术正逐步融入智慧城市建设的方方面面&#xff0c;为城市居民提供更智能、便捷、舒适的生活体验&#xff0c;开启了智慧城市的新时代。 01 优化城市规划与建设 AR技术在城市规划和建设中发挥着重要作用。城市规划师和…

可以在Mac电脑玩的拳皇97 for Mac(KOF97) 支持M1

《拳皇97》&#xff08;The King of Fighters 97&#xff09;是一款由SNK公司制作的拳击格斗游戏&#xff0c;于1997年在Arcade平台发布&#xff0c;随后在多个游戏平台上推出。该游戏是《拳皇》系列的第三个作品&#xff0c;继承了前作《拳皇96》的“adius”系统&#xff0c;并…

chrome 配置允许跨域

目录 1.Chrome跨域插件配置 1.1启动插件 1.2. 设置本地调试跨域 2 Firefox跨域插件 2.1. 安装插件 CORS Everywhere 2.2. 启动插件 3 工具下载链接 1.Chrome跨域插件配置 使用chrome插件“Allow CORS: Access-Control-Allow-origin ”来解决跨域问题。 点击pin图标&…

东兴市金顺心贸易有限公司联合越南名厨研发的阿吉贡河粉灵魂汤底料

东兴市金顺心贸易有限公司联合越南名厨研发的阿吉贡河粉灵魂汤底料&#xff0c;一包汤底料竟然就能撑起一家店的灵魂&#xff01;&#x1f372; 简单的食材&#xff0c;却散发出不平凡的美味&#xff0c;仿佛带我穿越千里之外。每一口都是满满的幸福与满足&#xff0c;真心推荐…

element ui 的 el-date-picker 日期选择组件设置可选日期范围

有时候&#xff0c;在使用日历控件的时候&#xff0c;我们需要进行定制&#xff0c;控制用户只能在指定日期范围内进行日期选择&#xff0c;在这里&#xff0c;我使用了 element ui 的 el-date-picker 日期选择控件&#xff0c;控制只能选择当前月及往前的2个月&#xff0c;效果…

java 笔记 第十二章 集合(部分整理细化)

集合概述 &#xff08;1&#xff09;集合是存储其他对象的特殊对象。可以将集合当做一个容器。 &#xff08;2&#xff09;集合的相关接口和类位于java.util包中 &#xff08;3&#xff09;集合中的接口和类是一个整体、一个体系。 集合接口 接口定义了一组抽象方法&#x…

98%企业竟存N日漏洞超5年,新漏洞利用攻击时长极速缩短!

专注推动网络与安全融合的全球网络安全领导者 Fortinet&#xff08;NASDAQ&#xff1a;FTNT&#xff09;&#xff0c;近日发布 FortiGuard Labs&#xff08;Fortinet全球威胁情报响应与研究团队&#xff09;《2023 下半年全球威胁态势研究报告》。本次新发布的半年度研究报告&a…

使用Python进行Socket接口测试

大家好&#xff0c;在现代软件开发中&#xff0c;网络通信是不可或缺的一部分。无论是传输数据、获取信息还是实现实时通讯&#xff0c;都离不开可靠的网络连接和有效的数据交换机制。而在网络编程的基础中&#xff0c;Socket&#xff08;套接字&#xff09;技术扮演了重要角色…

python练习题2

python期考复习题 目录 1. 判断n**2的值每一位互不相同​编辑 2. 密码 3. 图书版号 4. 情感分类矩阵 5. 计算数对个数 1. 判断n**2的值每一位互不相同 def isdiff(n):sstr(n)for i in range(len(s)):for j in range(len(s)):if i!j:if s[i]s[j]:return Falsereturn Truel…

Python输入与输出基础

Python输入与输出基础 引言 Python是一种非常直观且功能强大的编程语言&#xff0c;它允许用户轻松地处理输入和输出操作。无论是从用户那里获取数据&#xff0c;还是将结果展示给用户&#xff0c;Python都提供了简单易用的函数和方法。 一、输入数据 在Python中&#xff0c…

LSTM理解

目录 一、LSTM的本质 二、LSTM的原理 三、LSTM的应用 本文将从LSTM的本质、LSTM的原理、LSTM的应用三个方面&#xff0c;带您一文搞懂长短期记忆网络Long Short Term Memory | LSTM。 一、LSTM的本质 RNN 面临问题&#xff1a;RNN&#xff08;递归神经网络&#xff09;在处理…

数字时代的软件架构:持续架构的兴起与架构师角色的转变

在数字化浪潮的推动下&#xff0c;软件架构领域正经历着前所未有的变革。Eoin Woods在《数字时代的软件架构》演讲中&#xff0c;深入探讨了这一变革&#xff0c;并提出了“持续架构”这一概念。本文将基于Eoin的观点&#xff0c;结合个人理解&#xff0c;探讨持续架构的重要性…

Kali系统的中英文切换

执行命令&#xff1a;sudo dpkg-reconfigure locales 命令作用&#xff1a;重新生成locales配置文件并允许你重新选择所需的语言环境。 中文&#xff1a;zh_CN.UTF-8 UTF-8 英文&#xff1a;en_US.UTF-8 UTF-8 用空格键选中和取消选项。 要设置成中文&#xff1a;取消选择en…

【Git】远程仓库

一、常用的托管服务[远程仓库] 二、注册码云 三、创建远程仓库 四、配置SSH公钥 五、操作远程仓库 5.1、添加远程仓库 5.2、查看远程仓库 5.3、推送到远程仓库 5.4、 本地分支与远程分支的关联关系 5.5、从远程仓库克隆 5.6、从远程仓库中抓取和拉取 5.7、解决合并冲突 一、常…