为什么以下代码提供此输出?

a87*_*874 1 c printf format-specifiers

我正在调整printf()函数.因为printf()函数采用格式说明符来识别要打印的数据类型(纠正我,如果我错了)作为参数传递给它的数据类型的值,所以我尝试做这样的事情---

#include<stdio.h>
int main()
{
char *f="%d";
char *g="asd";

printf(f,g);
return 0;
}
Run Code Online (Sandbox Code Playgroud)

o/p是 -

4210739

我无法理解为什么o/p是一个数字?

Sou*_*osh 10

因为,您的代码调用未定义的行为.

您正在尝试使用格式说明符打印字符串%d.您应该使用%s格式说明符.对特定格式(转换)说明符使用错误类型的参数调用UB.

引用C11,第7.21.6.1章

[...]如果任何参数不是相应转换规范的正确类型,则行为未定义.

更改

char *f="%d";
Run Code Online (Sandbox Code Playgroud)

char *f="%s";
Run Code Online (Sandbox Code Playgroud)

  • 这肯定不是未定义的行为.格式%d告诉printf()语句将参数视为整数.将指针(内存地址)视为整数非常高兴.它打印的数字是`g`的地址 (5认同)
  • @Tibrogargan所以你基本上说,C标准是错的?哇...多么美好的一天! (4认同)
  • @Tibrogargan - 允许系统在不同的寄存器中传递指针和整数(以及浮点值),而不定义它是如何做的.使用错误的格式可能会从错误的寄存器中打印一个值 - 完全未定义. (4认同)
  • @Tibrogargan我不知道6.3.2.3是如何相关的.这里没有指针到整数的转换.变量参数仅进行默认参数提升.指针到整数不是默认参数提升. (3认同)
  • @Tibrogargan nopes,因为在这种情况下,标准提到了UB.我很擅长.:) (2认同)

Ant*_*lov 5

如前所述,说明%d符指定您将传递一个整数作为第二个参数,而是传递一个指针(*char类型)变量.因此,printf()例程将指针解释为整数并将其打印(实际上是它的值).

要正确输出字符串,您应该使用说明%s符.