【发布时间】:2014-07-24 13:19:53
【问题描述】:
Pebble Sdk 2.x 中的 snprintf 实现似乎有些奇怪
我修改了示例程序以显示点击计数器。 以下代码有效,如果我使用 str[1000] size
selectCount ++;
char str[1000], buf[100];
snprintf(str, 1000, "Click %d foo", selectCount);
snprintf(buf, 100, "s(%d) one two l(%d)", sizeof(str), strlen(str) );
if(selectCount % 2)
text_layer_set_text(text_layer, buf );
else
text_layer_set_text(text_layer, str );
但如果我将 str 的缓冲区大小减小到 400,应用程序就会崩溃
selectCount ++;
char str[400], buf[100];
snprintf(str, 400, "Click %d foo", selectCount);
snprintf(buf, 100, "s(%d) one two l(%d)", sizeof(str), strlen(str) );
if(selectCount % 2)
text_layer_set_text(text_layer, buf );
else
text_layer_set_text(text_layer, str );
但同样,如果我将 str 的大小减小到 20,它不会崩溃。相反,它将 buf 截断为 7 个字符;并且在 text_layer 中根本不显示 str。
当我执行时,非崩溃情况下的值看起来还不错
APP_LOG(APP_LOG_LEVEL_DEBUG, str);
对此的任何帮助表示赞赏。提前致谢。
【问题讨论】:
-
在未初始化的自动数组上调用 strlen() 很少能顺利结束。
-
这是最简单的崩溃示例吗?你能在没有 sizeof 和 strlen 的情况下复制吗?在此示例中最好发布 sscce。
-
@MartinJames:但是
str在这里被初始化了,这不是问题。 -
好的,那么当你调试它时,哪一行崩溃了?
-
你是如何定义 text_layer 的?
标签: c pebble-watch pebble-sdk