小编cFs*_*chb的帖子

sizeof("string") 的正确输出是什么?

在微控制器上,为了避免加载之前固件版本的设置,我还存储编译时间,在加载时检查该时间。

\n

该微控制器项目是使用MikroElektronika 的mikroC PRO for ARM”构建的。

\n

为了方便调试,我在PC上用minGW编写了代码,左右检查后,将其放入microC中。

\n

使用该检查的代码无法正常工作。经过一晚令人沮丧的调试后,我发现sizeof("...")在两个平台上产生了不同的值,并因此导致缓冲区溢出。

\n

但现在我不知道这是谁的错。

\n

要重新创建问题,请使用以下代码:

\n
#define SAVEFILECHECK_COMPILE_DATE __DATE__ " " __TIME__\n\nchar strA[sizeof(SAVEFILECHECK_COMPILE_DATE)];\nchar strB[] = SAVEFILECHECK_COMPILE_DATE;\n\nprintf("sizeof(#def): %d\\n", (int)sizeof(SAVEFILECHECK_COMPILE_DATE));\nprintf("sizeof(strA): %d\\n", (int)sizeof(strA));\nprintf("sizeof(strB): %d\\n", (int)sizeof(strB));\n
Run Code Online (Sandbox Code Playgroud)\n

在 MinGW 上它返回(如预期):

\n
#define SAVEFILECHECK_COMPILE_DATE __DATE__ " " __TIME__\n\nchar strA[sizeof(SAVEFILECHECK_COMPILE_DATE)];\nchar strB[] = SAVEFILECHECK_COMPILE_DATE;\n\nprintf("sizeof(#def): %d\\n", (int)sizeof(SAVEFILECHECK_COMPILE_DATE));\nprintf("sizeof(strA): %d\\n", (int)sizeof(strA));\nprintf("sizeof(strB): %d\\n", (int)sizeof(strB));\n
Run Code Online (Sandbox Code Playgroud)\n

然而,在“mikroC PRO for ARM”上,它返回:

\n
sizeof(#def): 21\nsizeof(strA): 21\nsizeof(strB): 21\n
Run Code Online (Sandbox Code Playgroud)\n

这种差异导致了缓冲区溢出(覆盖了指针 \xe2\x80\x93 的字节零)。

\n

21 是我期望的答案:20 个字符和 \'\\0\' …

c sizeof string-literals language-lawyer mikroc

39
推荐指数
3
解决办法
5033
查看次数

标签 统计

c ×1

language-lawyer ×1

mikroc ×1

sizeof ×1

string-literals ×1