在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);
对此有任何帮助表示赞赏。提前谢谢。
答案 0 :(得分:1)
您正在使用堆栈缓冲区,但text_layer_set_text
不会复制其内容。当绘图发生时,记忆不再存在。
字符串未被复制,因此其缓冲区很可能无法进行堆栈分配,但建议使用的是长期存在的缓冲区,至少只要TextLayer属于可见的层次结构。