当我使用 sprintf
函数时,为什么变量 A
的值发生了变化?
#include <stdio.h>
int main(void) {
short int A = 8000;
char byte_1[2] /*0001 1111 01000 0000*/, total[4];
sprintf(byte_1, "%i", A);
printf("%s\n", byte_1);// displayed on the screen 8000
printf("%i\n", A); // displayed on the screen 12336
}
最佳答案
byte_1
太短,无法接收 A
的十进制表示:它只有 1 位数字的空间以及空终止符和 sprintf
没有此信息,因此它将尝试写入超出 byte_1
数组的末尾,从而导致未定义的行为。
- 使
byte_1
变大,12 字节是一个好的开始。 sprintf
本质上是不安全的。使用snprintf
来防止缓冲区溢出:snprintf(byte_1, sizeof byte_1, "%i", A);
这是对这种意外输出的可能解释:假设 byte_1
在内存中位于 A
之前。 sprintf
将A
的值转换为五个字符'8'
, '0'
, '0 '
, '0'
和 '\0'
溢出 byte_1
的末尾,覆盖变量 的值>A
本身。当您稍后使用 printf
打印 A
的值时,A
不再具有值 8000
,而是 12336
... 只是未定义行为的无限可能影响之一。
试试这个更正后的版本:
#include <stdio.h>
int main(void) {
short int A = 8000;
char byte_1[12], total[4];
snprintf(byte_1, sizeof byte_1, "%i", A);
printf("%s\n", byte_1);
printf("%i\n", A);
return 0;
}
关于使用 sprintf 函数的附带效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51804415/