c/c++语言开发共享Printf没有参数说明

我理解如果printf没有给出参数,它会输出一个意外的值。

例:

#include  int main() { int test = 4 * 4 printf("The answer is: %dn"); return 0; } 

这将返回一个随机数。 在使用不同格式(如%p,%x等)后,它不会打印16(因为我没有将变量添加到参数部分)我想知道的是,这些值在哪里被采用从? 它是堆栈的顶部吗? 每次编译时它都不是新值,这很奇怪,它就像一个固定值。

     printf("The answer is: %dn"); 

    调用未定义的行为。 C要求转换说明符具有关联的参数。 虽然它是未定义的行为,并且任何事情都可能发生,但在大多数系统上,您最终会转储堆栈。 这是格式字符串攻击中使用的一种技巧。

    它被称为未定义的行为 ,它是可怕的 (见这个答案 )。

    如果您需要解释,则需要深入了解实现特定的详细信息。 因此,研究生成的源代码(例如使用gcc -Wall -Wextra -fverbose-asm +优化标志进行编译,然后查看生成的.s程序集文件)和系统的ABI 。

    printf函数将在堆栈中查找参数,即使您没有提供参数。 如果找不到整数参数,那么将使用任何内容。 大多数情况下,您将获得无意义的数据。 选择的数据取决于编译器的设置。 在某些编译器上,你甚至可能得到16。

    例如:

     int printf(char*, int d){...} 

    这将是printf的工作方式(不仅仅是一个例子)。 如果d为null或为空,它不会返回错误,它只是在堆栈上查找应该显示的参数。

    Printf是一个可变参数函数。 大多数编译器将参数推送到堆栈然后调用函数,但是,根据机器,操作系统,调用约定,参数个数等,还有其他值被压入堆栈,这可能在函数中是不变的。

    Printf读取这个内存区域并返回它。

      以上就是c/c++开发分享Printf没有参数说明相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/545612.html

      (0)
      上一篇 2021年1月10日
      下一篇 2021年1月10日

      精彩推荐