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

snprintf

提示:文章

文章目录

  • 前言
  • 一、背景
  • 二、
  • 三、
    • 3.1
  • 总结

前言

前期疑问:
本文目标:


一、背景

最近

二、

char countStr[4] = {'\0'};
strncpy(valueBuff, hmi_fireMonitor_gui[i].pName_cn, strlen(hmi_fireMonitor_gui[i].pName_cn));
int rxCount = 0;
rxCount = GetRxCount(i);
snprintf(countStr, sizeof(countStr), "%d", rxCount);
strncpy(valueBuff + 12, countStr, sizeof(countStr));
s_fireMonitor_Items[i].szVariableText = (char *)malloc(sizeof(valueBuff));
strcpy(s_fireMonitor_Items[i].szVariableText, valueBuff);
int t = 2;

上述代码是将RX1字符串存在valueBuff中,然后将数值1200拼到RX1字符串后面。
这里countStr长度过大,程序会内存泄露死机。

如果上面申请字符串长度为4,rxCount为1200, snprintf(countStr, sizeof(countStr), “%d”, rxCount);执行工艺countStr中存的是120,snprintf会在后面补充一个’\0’。

strncpy(valueBuff + 12, countStr, sizeof(countStr));
申请的countStr长度为5,执行上述代码也会死机。要么改成strncpy(valueBuff + 11, countStr, sizeof(countStr));这样就是给valueBuff 留了一个’\0’,或者申请的countStr长度为5,写成strncpy(valueBuff + 11, countStr, strlen(countStr));

在simpleGUI中界面绘制文字中,封装的结构体

typedef struct _ST_SGUI_ITEMS_ITEM_
{SGUI_CSZSTR                     cszLabelText;               // This pointer points to a character array constantSGUI_SZSTR                      szVariableText;             // This pointer points to a character array variable, this member will be used first if existed.struct _ST_SGUI_ITEMS_ITEM_*    pstPrev;struct _ST_SGUI_ITEMS_ITEM_*    pstNext;
}SGUI_ITEMS_ITEM;

SGUI_CSZSTR是const指针,SGUI_SZSTR是变量指针。如果要现实的是一个不需要改变的字符串,直接可以把const定义的常量字符串指针赋值给SGUI_CSZSTR。如果是字符串需要根据值拼接的,就需要让szVariableText指针指向malloc的内存。实际代码中发现出现malloc申请堆内存失败的情况。就想了个办法如果申请失败,就将"malloc free"常量字符串赋值给cszLabelText,界面上也能显示出。
我就准备专门定义一个宏,#define MALLOC_ERROR “malloc Error”,现在的问题是字符串 "malloc Error"是定义在flash中的吗,问了copilot,答案是是的。另一个问题,MALLOC_ERROR 可以直接复制给常量指针吗?是的,定义了#define MALLOC_ERROR "malloc Error"时,"malloc Error"是一个字符串常量,MALLOC_ERROR类型就是const char*,可以赋值给指针。

strcpy 函数在复制字符串时会自动在末尾添加空字符’\0’。
具体说明
当使用strcpy函数复制字符串时,它会持续复制源字符串的字符(包括结尾的空字符’\0’),直到遇到源字符串的结尾标志’\0’为止。因此,目标字符串的末尾会自动包含这个空字符,无需手动添加。
示例代码

cCopy Code
char dest;
char src = "hello";
strcpy(dest, src);
// 此时dest变为"hello\0",末尾自动包含'\0'

根据现有信息分析,strncpy函数是否在末尾添加\0取决于具体使用情况:
strncpy的补0规则:

  • 会补0的情况‌:当源字符串长度小于指定拷贝长度时,剩余空间会用\0填充12
  • 不会补0的情况‌:当源字符串长度大于或等于指定拷贝长度时,不会自动添加\012
    安全使用建议:
  • 推荐手动补0:无论何种情况,都应在拷贝后手动添加终止符\012
  • 封装函数方案:如safe_strncpy在拷贝前预置终止符1
  • 替代方案:考虑使用snprintf自动处理终止符2

三、

3.1


总结

未完待续

http://www.dtcms.com/a/337227.html

相关文章:

  • 《Python学习之使用标准库:从入门到实战》
  • 104、【OS】【Nuttx】【周边】文档构建渲染:安装 Sphinx 扩展(上)
  • 从零到一构建企业级GraphRAG系统:GraphRag.Net深度技术解析
  • Python Ovito统计多晶晶粒数量
  • 领域驱动设计(DDD)中的“核心领域逻辑与基础设施分离”原则
  • Maven 生命周期和插件
  • RocketMQ是什么?
  • Day7--滑动窗口与双指针--1695. 删除子数组的最大得分,2958. 最多 K 个重复元素的最长子数组,2024. 考试的最大困扰度
  • 消息队列中的推模式与拉模式
  • C++/Java双平台表单校验实战:合法性+长度+防重复+Tab顺序四重守卫
  • 【从0开始学习Java | 第14篇】集合(上)
  • Day8--滑动窗口与双指针--1004. 最大连续1的个数 III,1658. 将 x 减到 0 的最小操作数,3641. 最长半重复子数组
  • 考问通系统测试分析报告
  • Golang 语言中的指针操作
  • Android中使用RxJava实现网络请求与缓存策略
  • 实习两个月总结
  • 通义万相Wan2.1- 阿里推出的开源视频生成大模型
  • 从哲学(业务)视角看待数据挖掘:从认知到实践的螺旋上升
  • Elasticsearch查询中的track_total_hits参数
  • 【网络安全实验报告】实验五:网络嗅探及安全性分析
  • 在阿里云 CentOS Stream 9 64位 UEFI 版上离线安装 Docker Compose
  • CentOS 7更换国内镜像源
  • CentOS 7安装OpenVASGVM指南
  • 国产!全志T113-i 双核Cortex-A7@1.2GHz 工业开发板—ARM + DSP、RISC-V核间通信开发案例
  • [数据结构] ArrayList 与 顺序表
  • OVS:ovn为什么默认选择Geneve作为二层隧道网络协议?
  • 【Day 30】Linux-Mysql数据库
  • 大数据计算引擎(三)——Elasticsearch入门
  • uart串口 day57
  • 产品经理如何提升职场学习能力?破除成长瓶颈