簡體   English   中英

在printf()中使用格式說明符而沒有相應的值

[英]Using Format Specifiers in printf() Without a Corresponding Value

這是一個簡單的問題。

當您在要打印的字符串中使用格式說明符,但沒有列出要在字符串后面替換占位符的任何值時,您可以獲得看似隨機的數字,如2627389,6278253等作為輸出。 這是一個例子:

printf("%d %d %d");

輸出看起來像:

2621244 4352722 1426724

我想知道為什么會發生這種情況,這些數字意味着什么。 如果你有一個想法,它會真的有幫助。 謝謝。

在大多數情況下,這些數字是恰好位於堆棧或寄存器中的“隨機”值,具體取決於處理器。 在過去,函數的所有參數都在堆棧中傳遞,以相反的順序推送。 對於printf(),第一個參數和最后一個參數將是格式字符串。 在您的示例中,堆棧看起來像:

sp[0] = "%d %d %d"

printf將抓取堆棧的頂部(格式字符串)並解析它,在更高的堆棧位置抓取其他參數,根據格式字符串格式化它們並適當地輸出它們。

如果你有一個格式正確的printf調用,例如printf(“%d%d%d”,1,2,3),那么堆棧看起來像

sp[3] = 3
sp[2] = 2
sp[1] = 1
sp[0] = "%d %d %d"

printf可以達到您的預期:為每個格式說明符獲取適當的堆棧位置並對其進行適當格式化。 如果不傳遞其他參數,則會輸出在這些堆棧位置中發生的任何內容,因此輸出“隨機”值。

它被稱為“未定義的行為”;)

充其量,你會得到垃圾。 在最壞的情況下,您實際上可能會崩潰程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM