作者jlovet (偷拿程式碼的八卦)
看板C_and_CPP
標題Re: [語法] %d和%s的實際行為?
時間Mon Dec 21 19:15:05 2009
※ 引述《raincole (冷雨)》之銘言:
: 我想請問的是printf中%d和%f的事實上是如何作用的。
: 例如說printf("%s");會記憶體錯誤,但printf("%d");只是輸出一個垃圾值,
: 是什麼原因造成這種差別?
printf 有很多參數
第一個是格式 "%s" or "%d" ...
然後後面一個一個是要印出來的值
當你沒有指定的時候
也不知道他是去stack還是哪裡讀得參數...
那如果讀到1000,他就印出數字1000
或是,他就去記憶體位址1000的地方找字串來印...
問題是那個位址不一定是有效的位址...所以就出錯了
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 211.74.186.18
→ raincole:我就是問他到底會去哪裡讀參數..?還是沒規範? 12/21 19:56
→ raincole:我猜讀字串他會一直讀直到找到\0而記憶體錯誤 12/21 19:57
→ raincole:但是%d呢? 12/21 19:57
→ MOONRAKER:從自己的堆疊區裡面取值出來,指到哪裡就是哪裡。 12/21 20:12
→ jlovet:va_list,va_args,... 12/21 20:23
→ raincole:所謂「堆疊區」代表是已宣告的記憶體?所以不會出錯? 12/22 00:12
推 LPH66:應該說它預期在那裡要有一個值告訴他資料是什麼 12/22 05:12
→ LPH66:這個「那裡」(你想問的) 就是你傳參數時參數放在的位置 12/22 05:13
→ LPH66:那裡由於是個堆疊 故也叫堆疊區 12/22 05:13