Re: [語法] %d和%s的實際行為?

看板C_and_CPP作者 (偷拿程式碼的八卦)時間16年前 (2009/12/21 19:15), 編輯推噓1(108)
留言9則, 4人參與, 最新討論串2/4 (看更多)
※ 引述《raincole (冷雨)》之銘言: : 我想請問的是printf中%d和%f的事實上是如何作用的。 : 例如說printf("%s");會記憶體錯誤,但printf("%d");只是輸出一個垃圾值, : 是什麼原因造成這種差別? printf 有很多參數 第一個是格式 "%s" or "%d" ... 然後後面一個一個是要印出來的值 當你沒有指定的時候 也不知道他是去stack還是哪裡讀得參數... 那如果讀到1000,他就印出數字1000 或是,他就去記憶體位址1000的地方找字串來印... 問題是那個位址不一定是有效的位址...所以就出錯了 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 211.74.186.18

12/21 19:56, , 1F
我就是問他到底會去哪裡讀參數..?還是沒規範?
12/21 19:56, 1F

12/21 19:57, , 2F
我猜讀字串他會一直讀直到找到\0而記憶體錯誤
12/21 19:57, 2F

12/21 19:57, , 3F
但是%d呢?
12/21 19:57, 3F

12/21 20:12, , 4F
從自己的堆疊區裡面取值出來,指到哪裡就是哪裡。
12/21 20:12, 4F

12/21 20:23, , 5F
va_list,va_args,...
12/21 20:23, 5F

12/22 00:12, , 6F
所謂「堆疊區」代表是已宣告的記憶體?所以不會出錯?
12/22 00:12, 6F

12/22 05:12, , 7F
應該說它預期在那裡要有一個值告訴他資料是什麼
12/22 05:12, 7F

12/22 05:13, , 8F
這個「那裡」(你想問的) 就是你傳參數時參數放在的位置
12/22 05:13, 8F

12/22 05:13, , 9F
那裡由於是個堆疊 故也叫堆疊區
12/22 05:13, 9F
文章代碼(AID): #1BBrYyuO (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1BBrYyuO (C_and_CPP)