我的sprintf()函数用的对吗?

bandaoyu 2012-05-06 12:00:04
我的sprintf()函数用的对吗?有没有可能越界,造成内存操作错误?

我遇到了一个问题:http://topic.csdn.net/u/20120505/20/431fab75-9cb3-42d8-aa92-0ef919030c51.html,删除掉sprintf()函数后症状消失,所以我怀疑我的sprintf函数用的正确。

我sprintf()函数的用法是:

第一处:
void gprs_send_data_buf(char *data,unsigned int data_len)
{
……
char len_str[6]={0};
sprintf(len_str,"%d",data_len); //数值转换成字符放入len_str
……
}

unsigned int 最多是65535 5个字节+一个结束符\0 也就是6个字节 所以len_str[6]={0};长度是够的不会出现缓存溢出吧?


第二处(第一处保留的情况下,这一处注释掉之后,依然出现下载后溢出警告):


mode 处放入的参数数组是:char mode_str[4]={0};
ip char ip_str[16]={0};
port char port_str[5]={0};
void gprs_establish_connection(char* mode, char* ip, char* port)
{
char link[100]={0};
sprintf(link,"AT+CIPSTART=\"%.*s\",\"%.*s\",\"%.*s\"\r\n",3,mode,15,ip,4,port);
UART0_Send_Str(link);
}


第三处:(第一处保留的情况下,这一处注释掉之后,依然出现下载后溢出警告):


int draw_value(int x,uint16 y,float value,char *format,char color,char* last_str,int last_str_len)
{

……
char str[17];
new_str_len=sprintf(str,format, value);
……
}

...全文
198 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
bandaoyu 2012-05-16
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
引用楼主 的回复:
unsigned int 最多是65535
这个结论怎么得出来的?
[/Quote] 我的单片机是MSP430 5438 16位机器,int型是16位的 只能表示-3w-+3w unsigned int
最大只能表示:65535
qq120848369 2012-05-16
  • 打赏
  • 举报
回复
snprintf还是很安全的。
千树之影 2012-05-16
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
unsigned int 最多是65535 [/Quote]
这个结论怎么得出来的?
赵4老师 2012-05-16
  • 打赏
  • 举报
回复
无论如何snprintf还是要用的。
酱油党 2012-05-16
  • 打赏
  • 举报
回复
那把那个6个字节的改成9个字节试试不就知道了!
bandaoyu 2012-05-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
用snprintf,unsigned int指不定多大,最大4294967295是常见的
[/Quote]
不会吧,我是16位单片机,已经int 不超过65535吧
Lactoferrin 2012-05-06
  • 打赏
  • 举报
回复
用snprintf,unsigned int指不定多大,最大4294967295是常见的
iamnobody 2012-05-06
  • 打赏
  • 举报
回复
char len_str[100];

int 不只那么大. 数组也没有必要初始化.

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧