sprintf格式化字符串时小心内存使用错误

内存问题:在做程序的时候,发现一个奇怪的问题,就是在 USB 和 DVD 的某个窗口中总是出现 ISBUS 收信失败的现象,表现为就是 USB 或 DVD 端的发信函数返回失败,就是没有回 ACK 导致他们认为发信失败,通过调查发现接收端的 ISBUS接收信息的缓冲的前 5 个字节被改写了,我们认为是内存不够用了,导致内存使用溢出改写了 ISBUS 缓冲区内的内容.临时对应就是在 ISBUS 缓冲前面加一个 20 个字节的无用数组,这个问题解决(更加让我们坚定是内存不够用了).但问松下,松下坚定的说如果内存不够用会在编译和连接下载时就出错.
后来调查是 sprintf 调用的问题,如下面的句子
char m_szTitle[20];
sprintf(m_szTitle, " %d/%d   %d/%d   %d:%d:%d",
                    pPlayInfo->CurrentTitleNum,
                    pPlayInfo->AllTitleNum,
                    pPlayInfo->CurrentChapterNum,
                    pPlayInfo->AllChapterNum,
                    pPlayInfo->NowPlayTime.hour,
                    pPlayInfo->NowPlayTime.minute,
                    pPlayInfo->NowPlayTime.sencond
);
注意上面的问题,m_szTitle 限定了 20 个字节的长度,而 %d 的转化不能保证长度,如数字 1234 转化为字串为 "1234",就占了 4 个字节,几个 %d 合起来就造成了 m_szTitle[20] 的内存不够用了.原来是这样的问题啊.

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值