sprintf格式化字符串时小心内存使用错误
2010-12-11 20:35
369 查看
内存问题:在做程序的时候,发现一个奇怪的问题,就是在 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] 的内存不够用了.原来是这样的问题啊.
后来调查是 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] 的内存不够用了.原来是这样的问题啊.
相关文章推荐
- sprintf 编辑 sprintf指的是字符串格式化命令,主要功能是把格式化的数据写入某个字符串中。sprintf 是个变参函数。使用sprintf 对于写入buffer的字符数是没有
- 如何使用PHP函数sprintf()将字符串格式化
- 【Python_Demo_1】使用Python实现C语言中sprintf()格式化字符串写入函数
- 在C++编程中使用sprintf_s实现字符串的格式化拼接与输出
- Oralce错误处理一例(使用OracleBulkCopy要非常小心)
- 使用FormatMessage格式化错误消息代码
- JAVA字符串格式化-String.format()的使用
- c# 字符串连接使用“+”和string.format格式化两种方式
- 使用cout格式化输出字符串
- json时间数据,使用javascript格式化字符串
- 字符数组和字符串的相互转化 和sprintf的使用
- 使用Windbg调试系统弹出的内存不可读错误
- JAVA字符串格式化-String.format()的使用(转)
- 不小心,代码重构产生严重错误,狂占内存
- 错误使用Handler引发的内存泄露
- MYSQL存储过程中使用临时表(错误:内存不可读)
- JAVA字符串格式化String.format()的使用
- 小心错误使用EasyUI 让网站性能减半
- JAVA字符串格式化-String.format()的使用
- C语言snprintf()函数:将格式化的数据写入字符串—sprintf()