[問題] malloc 超出範圍卻可以印

看板C_and_CPP作者 (Tenebrous)時間14年前 (2011/03/13 01:57), 編輯推噓4(4021)
留言25則, 12人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) Linux 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) No 問題(Question): 小弟使用malloc去分配一個大小為10的空間給 *ch 再將字串用strcpy複製到裡面 (字串長度>所給的空間大小) 執行之後竟然不會出錯 為什麼呢? 餵入的資料(Input): 無 已寫入程式裡面 預期的正確結果(Expected Output): 應該要顯示錯誤 錯誤結果(Wrong Output): 他過了 且正確的印出超出範圍的字串 程式碼(Code):(請善用置底文網頁, 記得排版) http://paste.plurk.com/show/396467/ 補充說明(Supplement): 原先是想要測試 realloc的功能 先用malloc去設定一個大小不足的空間 再用realloc 把他加大 但沒想到 設小一點居然不會出錯 = = -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.27.214.250

03/13 02:02, , 1F
運氣好而已... 不然你覺得 怎樣的錯才是你預期的???
03/13 02:02, 1F

03/13 02:08, , 2F
原先預期會 segmentation fault 不然就超出的地方印不出來
03/13 02:08, 2F

03/13 02:08, , 3F
下面直接印 ch[21] 的部分則預期他會印出亂碼
03/13 02:08, 3F

03/13 02:11, , 4F
你要一塊記憶體的時候OS都會多給 你沒用超過他多給的
03/13 02:11, 4F

03/13 02:11, , 5F
超過範圍並不是一定會當掉,這就是難抓蟲的原因
03/13 02:11, 5F

03/13 02:12, , 6F
你可以試試印到多少的時候會錯
03/13 02:12, 6F

03/13 02:13, , 7F
但同樣的code在windows下跑 就會當掉 然後把字串縮小到範
03/13 02:13, 7F

03/13 02:13, , 8F
圍內就會正常了 QQ
03/13 02:13, 8F

03/13 02:14, , 9F
所以這個問題是出在 Linux在我索求記憶體時他會多一些給我
03/13 02:14, 9F

03/13 02:14, , 10F
的原因?
03/13 02:14, 10F

03/13 02:16, , 11F
有可能,真正的原因不容易探求,只能說程式不要這麼寫
03/13 02:16, 11F

03/13 02:16, , 12F
你有興趣的話去挖挖看malloc的原始碼 說不定會有答案XDD
03/13 02:16, 12F

03/13 02:30, , 13F
那你用的開心嘛?
03/13 02:30, 13F

03/13 03:10, , 14F
樓上是 ?
03/13 03:10, 14F

03/13 03:23, , 15F
Linux系統表示「我用記憶體的方式與M$不同」 ( ̄ー ̄;)
03/13 03:23, 15F

03/13 04:51, , 16F
這部份的記憶體管理主要是 depend on 你的 runtime lib
03/13 04:51, 16F

03/13 04:51, , 17F
不要什麼都推給作業系統
03/13 04:51, 17F

03/13 09:55, , 18F
strcpy 好像不會管你長度是多少,如果沒出錯是幸運
03/13 09:55, 18F

03/13 09:56, , 19F
但當你code日積月累的時候,這通常都是頭痛的主因
03/13 09:56, 19F

03/13 10:33, , 20F
strcpy 會找到來源的 \0 位置, 然後把直到它的記憶體內容
03/13 10:33, 20F

03/13 10:34, , 21F
一鼓腦通通拷到目標記憶體位置後面, 這可以寫後門的XD
03/13 10:34, 21F

03/13 10:49, , 22F
都印了,還不老實
03/13 10:49, 22F

03/14 01:28, , 23F
因為記憶體保護的單位是page吧 page以內都算可存取區段
03/14 01:28, 23F

03/16 02:18, , 24F
記憶體保護不一定要page吧, segment也可以作為記憶體
03/16 02:18, 24F

03/16 02:19, , 25F
保護的單位
03/16 02:19, 25F
文章代碼(AID): #1DUxFwlp (C_and_CPP)