为什么下面的代码会给出这个输出?

Why the following code gives this output?

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

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

printf(f,g);
return 0;
}

而 o/p 是--

4210739

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

因为,您的代码调用了 undefined behavior.

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

引用 C11,章节 §7.21.6.1

[...] If any argument is not the correct type for the corresponding conversion specification, the behavior is undefined.

改变

char *f="%d";

char *f="%s";

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

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

你说,

Since the printf() function takes a format specifier in order to recognize the datatype to print (Correct me if i'm wrong)

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

当你打电话时

printf(f, g);

要理解的关键是 printf 无法知道 g.

的类型

当您调用 printf 时,您的 工作是确保您在格式字符串,您传递了正确类型的参数。对于格式字符串中的每个 %d,您必须传递一个 int。对于格式字符串中的每个 %f,您必须传递一个 double。对于格式字符串中的每个 %s,您必须传递指向有效字符串的 char *。等等。

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

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