2011-11-17 211 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

@詹姆斯,但我問爲什麼發生了什麼事情。說許多場景是可能的並且解釋特定場景的原因是有區別的。 –