函数printf()的问题

时间:2011-09-18 09:28:19

标签: c arguments printf formats

这是我的计划:

#include <stdio.h>
int main()
{
    int a=0x09;
    int b=0x10;
    unsigned long long c=0x123456;
    printf("%x %llx\n",a,b,c);//in "%llx", l is lowercase of 'L', not digit 1
    return 0;
}
输出是:

9 12345600000010

我想知道:

  1. 如何执行printf()函数?
  2. 如果参数的数量不等于格式的数量会发生什么?
  3. 请帮助我并以此程序为例进行解释。

3 个答案:

答案 0 :(得分:2)

问题是您的类型不匹配。这是未定义的行为。

您的第二个参数b与格式的类型不匹配。所以发生的事情是printf()正在读取超过4个字节的b(printf期望一个8字节的操作数,但b只有4个字节)。所以你得到了垃圾。由于您的printf()只有2个格式代码,因此根本不打印第3个参数。

由于参数通常在内存中连续(和相邻)传递,printf()正在读取的4个额外字节实际上是c的低4字节。

所以最后,正在打印的第二个数字等于b + ((c & 0xffffffff) << 32)

但我想重申一下: 此行为未定义 。只是今天大多数系统的行为都是这样的。

答案 1 :(得分:1)

如果传递给printf的参数与格式规范不匹配,则会得到未定义的行为。这意味着任何事情都可能发生,您无法推断您在特定系统上看到的结果。

在您的情况下,%llx需要unsigned long long类型的参数,但您提供了int。仅这一点就会导致不确定的行为。

将更多参数传递给printf并不是错误,而不是格式说明符,超出的参数会被计算但会被忽略。

答案 2 :(得分:0)

printf()根据格式增加指针一次读取一个参数。如果格式化参数的数量大于参数的数量,则printf()将从未知的内存位置输出数据。但是,如果参数的数量大于格式化参数的数量,则不会造成任何损害。例如。如果格式化参数和参数的数量不匹配,gcc将发出警告。