可能重複:
Behaviour of printf when printing a %d without supplying variable name如果在使用printf格式之後沒有參數會發生什麼?
如果我使用,會發生什麼,例如,輸出( 「%d%d」); ? 它會彈出堆棧中的最後八個字節並將它們打印出來嗎?
可能重複:
Behaviour of printf when printing a %d without supplying variable name如果在使用printf格式之後沒有參數會發生什麼?
如果我使用,會發生什麼,例如,輸出( 「%d%d」); ? 它會彈出堆棧中的最後八個字節並將它們打印出來嗎?
從技術上講,如果printf()
中的格式說明符的數量大於參數的數量,則它的未定義行爲。
但是下面是細
printf("%d",x,y); // y is evaluated but not printed.
在GCC - 你得到一個警告(這是使用__attribute__ ((__warn_unused_result__))
完成)。
在x86上,您不會收到堆棧錯誤,因爲調用者會將數據推送到堆棧,並且在函數返回後也彈出。這被稱爲C調用約定,與pascal不同,該函數也會彈出堆棧中的數據(例如,在ASM中使用ret 10
)。
你需要的數據值是隨機的。
在這種情況下,你會得到garbage data
,它依靠編譯器及其編譯選項....
它將打印垃圾值,但它警告「比數據參數更多%的轉化率」。