2011-11-17 192 views
1

我通过汇编代码使用printf。我注意到在下面的例子中,如果我省略了期望的参数,垃圾被打印。为什么省略printf打印垃圾的参数?

.386 
    .model flat, c 
    .stack 100h 
printf PROTO arg1:Ptr Byte, printlist:VARARG 
    .data 
msg3fmt byte 0Ah,"%s",0Ah,"test output",0Ah,0 
    .code 
main proc 
    INVOKE printf, ADDR msg3fmt 
    ret 
main endp 
    end 

我的问题是为什么?有没有一个设置的内存地址printf使用期望找到一个参数?为什么打印任何东西,因为没有参数通过?

回答

6

原因是格式说明符告诉printf应该收到多少个参数。 Printf从堆栈获取数据;如果你没有提供任何数据,那么它会将任何发生在堆栈上的事情都视为参数。

2

标准说

如果格式说明在printf()数量比参数个数的行为是不确定的更大。

未定义的行为意味着任何东西都可能发生。

+0

我在问为什么背后发生了什么,而不是一般的答案,行为是未定义的。 –

+0

@Sonny这是关于未定义行为的事情。 '为什么'是未定义的。这是......未定义的行为。你看到的行为可能有一个可能的原因“堆栈中找不到参数”,但在ARM上,前几个可变参数是在寄存器中,所以答案是错误的。你可以想出各种有效的可变参数和C调用约定。所以唯一清晰,简洁的说法是,它调用未定义的行为。 –

+0

@詹姆斯,但我问为什么发生了什么事情。说许多场景是可能的并且解释特定场景的原因是有区别的。 –