我通過彙編代碼使用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使用期望找到一個參數?爲什麼打印任何東西,因爲沒有參數通過?
我在問爲什麼背後發生了什麼,而不是一般的答案,行爲是未定義的。 –
@Sonny這是關於未定義行爲的事情。 '爲什麼'是未定義的。這是......未定義的行爲。你看到的行爲可能有一個可能的原因「堆棧中找不到參數」,但在ARM上,前幾個可變參數是在寄存器中,所以答案是錯誤的。你可以想出各種有效的可變參數和C調用約定。所以唯一清晰,簡潔的說法是,它調用未定義的行爲。 –
@詹姆斯,但我問爲什麼發生了什麼事情。說許多場景是可能的並且解釋特定場景的原因是有區別的。 –