下面是一個簡短問題。在沒有對應值的情況下在printf()中使用格式說明符
當您要打印的字符串中使用格式說明符,但不要列出您希望用字符串替換佔位符後的任何值時,您會看到隨機數字,例如2627389,6278253等輸出。這裏有一個例子:
printf("%d %d %d");
輸出看起來是這樣的:
2621244 4352722 1426724
我想知道爲什麼發生這種情況,以及這些數字的含義。如果你有一個想法,這將真的有幫助。 謝謝。
下面是一個簡短問題。在沒有對應值的情況下在printf()中使用格式說明符
當您要打印的字符串中使用格式說明符,但不要列出您希望用字符串替換佔位符後的任何值時,您會看到隨機數字,例如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會做你所期望的:抓住適當的堆棧單元每個格式說明並格式化適當。當你不傳遞其他參數時,不管是在堆棧位置發生什麼,都會輸出,因此是「隨機」值。
你已經非常清楚printf是如何工作的,非常感謝你。 – Puk
這就是所謂的 「不確定的行爲」;)
在最好的情況,你會得到垃圾。最糟糕的是,你實際上可能會使程序崩潰。
它是未定義的行爲,但在這種情況下通常發生的事情是'printf'只是抓住了它期望它的參數的字節,就是堆棧或某些寄存器中的字節。如果它期望一些指針,崩潰不是不可能的。 –
[printf參數錯誤會導致奇怪的結果]的可能重複(http://stackoverflow.com/questions/11054064/wrong-number-of-parameters-to-printf-leads-to-strange-results) –