【问题标题】:snprintf bug on pebble卵石上的 snprintf 错误
【发布时间】: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


【解决方案1】:

您正在使用堆栈缓冲区,但 text_layer_set_text 不会复制其内容。当绘制发生时,内存不再存在。

来自documentation

字符串没有被复制,因此它的缓冲区很可能不能被堆栈分配,但建议是一个长期存在的缓冲区,至少只要 TextLayer 是可见层层次结构。

【讨论】:

  • 正确。解决方案是将 char[] 设为静态或将其设为全局变量。
猜你喜欢
  • 2016-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-23
  • 2020-01-31
  • 1970-01-01
  • 1970-01-01
  • 2015-10-14
相关资源
最近更新 更多