2012-11-04 70 views
3

下面是一個簡短問題。在沒有對應值的情況下在printf()中使用格式說明符

當您要打印的字符串中使用格式說明符,但不要列出您希望用字符串替換佔位符後的任何值時,您會看到隨機數字,例如2627389,6278253等輸出。這裏有一個例子:

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

輸出看起來是這樣的:

2621244 4352722 1426724 

我想知道爲什麼發生這種情況,以及這些數字的含義。如果你有一個想法,這將真的有幫助。 謝謝。

+4

它是未定義的行爲,但在這種情況下通常發生的事情是'printf'只是抓住了它期望它的參數的字節,就是堆棧或某些寄存器中的字節。如果它期望一些指針,崩潰不是不可能的。 –

+0

[printf參數錯誤會導致奇怪的結果]的可能重複(http://stackoverflow.com/questions/11054064/wrong-number-of-parameters-to-printf-leads-to-strange-results) –

回答

2

在大多數情況下,這些數字是恰好位於堆棧或寄存器中的「隨機」值,具體取決於處理器。在過去的日子裏,一個函數的所有參數都在堆棧上傳遞,按相反的順序推送。對於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會做你所期望的:抓住適當的堆棧單元每個格式說明並格式化適當。當你不傳遞其他參數時,不管是在堆棧位置發生什麼,都會輸出,因此是「隨機」值。

+0

你已經非常清楚printf是如何工作的,非常感謝你。 – Puk

1

這就是所謂的 「不確定的行爲」;)

在最好的情況,你會得到垃圾。最糟糕的是,你實際上可能會使程序崩潰。

相關問題