在微控制器上,为了避免从以前的固件版本加载设置,我还存储了编译时间,该时间在加载时进行判断.
微控制器项目是从MikroElektronika开始用'mikroC PRO for ARM'建造的.
为了更容易调试,我在PC上用minGW编写了代码,并在左右判断后,将其放入microc.
使用该判断的代码无法正常工作.经过一晚令人沮丧的调试后,我发现101,并因此导致缓冲区溢出.
但现在我不知道是谁的错.
要重新创建问题,请使用以下代码:
#define SAVEFILECHECK_COMPILE_DATE __DATE__ " " __TIME__
char strA[sizeof(SAVEFILECHECK_COMPILE_DATE)];
char strB[] = SAVEFILECHECK_COMPILE_DATE;
printf("sizeof(#def): %d\n", (int)sizeof(SAVEFILECHECK_COMPILE_DATE));
printf("sizeof(strA): %d\n", (int)sizeof(strA));
printf("sizeof(strB): %d\n", (int)sizeof(strB));
在MinGW上,它返回(不出所料):
sizeof(#def): 21
sizeof(strA): 21
sizeof(strB): 21
然而,在'mikroC PRO for ARM'上,它返回:
sizeof(#def): 20
sizeof(strA): 20
sizeof(strB): 21
这种差异导致缓冲区溢出(指针的0字节-哎哟).
21是我期望的答案:20个字符和'\0'终止符.
这是C中"视情况而定"的事情之一,还是违反了sizeof
操作符的行为?