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

时间:2016-04-30 20:13:46

标签: c printf format-specifiers

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

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

printf(f,g);
return 0;
}

而o / p是 -

  

4210739

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

3 个答案:

答案 0 :(得分:10)

因为,您的代码会调用undefined behavior

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

引用C11,章节§7.21.6.1

  

[...]如果有任何论据   不是相应转换规范的正确类型,行为是   未定义。

更改

char *f="%d";

char *f="%s";

答案 1 :(得分:5)

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

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

答案 2 :(得分:0)

你说,

  

因为printf()函数采用格式说明符来识别要打印的数据类型(如果我错了就纠正我)

我不确定,但我认为你在这里可能有点不对。

致电时

printf(f, g);

要理解的关键是 printf无法知道g 的类型。

当你致电printf时,你的工作是为了确保你在格式字符串中使用的每个格式说明符(即每%个东西),你传递正确类型的参数。对于格式字符串中的每个%d,您必须传递int。对于格式字符串中的每个%f,您必须传递double。对于格式字符串中的每个%s,您必须传递指向有效字符串的char *。等等。

在您的代码中,格式字符串中有%d,但您传递int指向字符串,而不是传递char *。所以你没有得到你期望的结果。

%d想要一个int,但你没有给它一个。您通过了char *,但printf不知道如何处理它。 (如果您使用过%s,则printf会知道如何处理char *。)