在鹅卵石上的snprintf bug

时间:2014-07-24 13:19:53

标签: c pebble-watch pebble-sdk

在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,它就不会崩溃。相反,它会截断7个字符的buf;并且在text_layer中根本不显示str。

执行

时,非崩溃案例中的值看起来不错
APP_LOG(APP_LOG_LEVEL_DEBUG, str);

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

1 个答案:

答案 0 :(得分:1)

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

来自documentation

  

字符串未被复制,因此其缓冲区很可能无法进行堆栈分配,但建议使用的是长期存在的缓冲区,至少只要TextLayer属于可见的层次结构。