Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 鹅卵石上的snprintf错误_C_Pebble Watch_Pebble Sdk - Fatal编程技术网

C 鹅卵石上的snprintf错误

C 鹅卵石上的snprintf错误,c,pebble-watch,pebble-sdk,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(sel

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个字符;并且在文本层中根本不显示str

当我执行时,非崩溃情况下的值看起来不错

APP_LOG(APP_LOG_LEVEL_DEBUG, str);

在此方面的任何帮助都将不胜感激。提前感谢。

您使用的是堆栈缓冲区,但
文本\u层\u集\u文本
不会复制其内容。绘图时,内存不再存在

从:

字符串未被复制,因此其缓冲区很可能无法堆栈分配,但建议使用寿命长的缓冲区,至少只要TextLayer是可见层层次结构的一部分


在未初始化的自动数组上调用strlen()很少有好结果。这是最简单的崩溃例子吗?没有sizeof和strlen你能复制吗。在本例中,发布sscce最好。@MartinJames:但是
str
在这里初始化,这不是问题所在。那么,当您调试它时,哪一行崩溃了?您是如何定义文本层的?正确。解决方案是将char[]设置为静态或将其设置为全局变量。