2

snprintfPebble Sdk 2.x 中的实现似乎有些奇怪

我修改了示例程序以显示点击计数器。如果我使用 str[1000] 大小,则以下代码有效

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);

对此的任何帮助表示赞赏。提前致谢。

4

1 回答 1

1

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

文档中:

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

于 2014-07-24T21:03:52.467 回答