使用 sprintf 函数的附带效果

标签 c

当我使用 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 之前。 sprintfA的值转换为五个字符'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/

相关文章:

C语言逐字节复制指针的内容无限循环

c - 调试 C 程序以求 400 万以下斐波那契数列的所有偶数项之和

c - 如何响应有关列表框项目中右键的鼠标消息?

c++ - BCB swprintf 不工作

c - gcc -Wall 编译器输出中的隐式声明错误

clang : error: unknown argument: '-wall'

c++ - 从 ICMP 报文访问 UDP

c - 在 Matlab 和 C 之间共享数据

c - 返回函数指针的函数声明

c - 循环输入行并调用 C 中的函数?