jel*_*ito 0 c printf static pic reentrancy
我遇到一个显示一些奇怪行为的静态变量的问题.希望有人可以提供帮助,这里是代码:
void digitRefresh(void){
static char digitenabled=1;
sprintf(digits, "%d", number+10000);
switch (digitenabled) {
case 1: digitDecode(digits[1] - 48);
CATHODE_1 = ENABLE;
break;
case 2: digitDecode(digits[2] - 48);
CATHODE_2 = ENABLE;
break;
case 3: digitDecode(digits[3] - 48);
CATHODE_3 = ENABLE;
break;
case 4: digitDecode(digits[4] - 48);
CATHODE_4 = ENABLE;
break;
}
delay_ms(DIGIT_DELAY);
disableAllCathodes();
return;
Run Code Online (Sandbox Code Playgroud)
}
顺便说一下数字被定义为 char digits[5];
正如您所看到的,我正在定义一个本地静态变量,因此当多次调用此函数时,我可以跳转到程序的不同位置.
我刮胡子的问题是在第二行代码中.当sprintf被执行时,var digitenabled以某种方式将其值更改为零.你可以在代码中看到它之前的一个,但是在sprint之后我放了一个断点,由于某种原因它是零.
如果我不通过注释来使用sprintf,则问题就会消失,变量会按预期运行(不清除并在再次调用函数时保留该值).
sprintf做错了吗?所以变量消失了?有任何想法吗 ?
这是在使用XC8编译器的微控制器PIC16F1847上.谢谢
问题出在这里:
char digits[5]; // from comment -jelipito
sprintf(digits, "%d", number+10000); // from question code.
Run Code Online (Sandbox Code Playgroud)
假设number= 0.
sprintf()写入"10000"加上字符串终止符digits,总共6个字符.但是,数字是一个只有五个字符的数组.写入数组的末尾会导致不可预测的结果.
重新定义char digits[5];到char digits[50];,什么是大到足以容纳的sprintf()函数的输出.
您可能考虑的另一个安全网是替换sprint()为snprintf():
snprintf(digits, sizeof(digits), "%d", number+10000);
Run Code Online (Sandbox Code Playgroud)
snprintf()函数不会超出数字数组的大小(就像sprintf()那样).相反,它会截断输出(如果需要)以防止这样做.
| 归档时间: |
|
| 查看次数: |
613 次 |
| 最近记录: |