2011-09-02 362 views
-6
#include<stdio.h> 

int main() 
{ 
    int a,*b,**c,***d,****e; 
    a=10; 
    b=&a; 
    c=&b; 
    d=&c; 
    e=&d; 
    printf("\na=%d b=%u c=%u d=%u e=%u",a,b,c,d,e); 
    printf("\n%d %d %d %d %d",a,a+*b,**c+***d+****e); 
    return 0; 
} 

我无法编辑这篇文章...所有选项这样做是不可见的我的browser.I本意是问为什么编译器没有警告我和给我的额外格式说明符为0 0。printf()在c打印0的额外格式说明符

+3

问题在哪里? – Griwes

+1

坦率地说,你很幸运,这是打印的0。不传递格式说明符的值会导致随机出现的东西。在过去的日子里有更多的东西,或者可能是寄存器的内容。 – Julian

+0

编译器没有警告你,因为你没有配置它。我不能告诉你该怎么做,因为我无法猜测你的编译器。你不关心它为什么打印出0。 –

回答

3

当给定五个转换规范但只有三个参数时,您希望它打印什么?

C标准说,在7.19.6.1/2

If there are insufficient arguments for the format, the behavior is undefined.

在你的情况下,程序happend打印零。在我的情况下,它印了别的东西。

编辑回应这个问题: “为什么?”:大多数编译器就发出警告此错误:

GCC说warning: format ‘%d’ expects a matching ‘int’ argument

铛说warning: more '%' conversions than data arguments

ICC说warning #267: the format string requires additional arguments

然而,没有要求他们必须诊断这一点。未定义的行为就是这样,未定义。任何事情都可能发生。

5

您没有为第二次调用printf提供足够的参数,并且调用了未定义的行为。请不要这样做。如果您正确配置其警告,编译器应警告此问题: