推 s89227: 不太懂問題,是問只有malloc一個char的str怎麼能strcpy那 08/04 16:34
→ s89227: 麼多次沒爆炸嗎? 08/04 16:34
→ s89227: 印大小的話,呼叫sizeof再印出來呀? 08/04 16:36
→ EngRookie: 1. 可以編譯也可以執行 2. sizeof 沒辦法印出malloc 08/04 16:47
→ Caesar08: 1 08/04 16:48
→ Caesar08: 但你應該malloc(sizeof(char)+1) 08/04 16:50
這個我知道,但是我想知道為什麼我可以再一個byte的空間裡面塞入多個字串
※ 編輯: EngRookie (61.220.255.38), 08/04/2016 16:54:57
→ Caesar08: 因為你一直copy到同個位置 08/04 16:57
→ shadow0326: 為什麼我只有一個杯子 每天卻可以喝那麼多水 08/04 16:59
不好意思,我有點不了解,我再同一個記憶體位置放入"a",那麼我 strcat(str, "b")時,這個b應該是會放入 str+1 的位置
但是很明顯我並沒有分配 str+1 的位置出來,是我觀念有點問題嗎 T___T
※ 編輯: EngRookie (61.220.255.38), 08/04/2016 17:14:11
推 bibo9901: 你租一間套房但自己把牆壁打掉佔用隔壁間 有沒有問題? 08/04 17:16
→ bibo9901: 在房客回來或房東報警前當然是沒有啦... 08/04 17:16
→ Caesar08: 如果你的str是"a\0",那strcat就會放在str+1 08/04 17:24
→ Caesar08: 如果你的str是a,沒有null-terminated character,那就 08/04 17:24
→ Caesar08: 是undefined behavior 08/04 17:25
推 Bencrie: 原 po 只是單純想問存取越界為什麼不會爆炸吧 08/04 17:34
我大概了解原來記憶體位置可以這樣越界操作,我之前都乖乖把記憶體範圍算好好的
謝謝各位大大的解釋
※ 編輯: EngRookie (61.220.255.38), 08/04/2016 17:36:31
推 s25g5d4: 這問題很深 要從 data segement, heap, brk() system 08/04 17:35
→ s25g5d4: call 開始說起 08/04 17:35
→ s25g5d4: 你可以想像 brk() 會跟 OS 要多一點的 heap 空間 08/04 17:36
→ s25g5d4: 但是呼叫這樣一個 system call 是需要時間的 08/04 17:36
→ s25g5d4: 所以 malloc() 傾向拿多一點的空間 而不會拿剛剛好 08/04 17:36
→ s25g5d4: 但是使用者呼叫 malloc(sizeof char) 就只有要求 1 btye 08/04 17:36
→ s25g5d4: 所以 malloc 本身的紀錄會僅有 1 byte 被用掉 08/04 17:37
→ s25g5d4: 但事實上因為空間有多要一點 所以後面是很可能可以存取的 08/04 17:37
→ s25g5d4: 但這是 undefined behavior, 沒有人可以保證會發生甚麼事 08/04 17:37
→ s25g5d4: 如果你剛好用完 brk() 要到的空間 接下來就噴 segement 08/04 17:38
→ s25g5d4: fault 了 08/04 17:38
推 crazycy: 樓上強者大大Orz 08/04 17:40
推 s25g5d4: 樓上廚 08/04 17:40
→ james732: 你只租了一間房間,但是你的東西擺到隔壁去了 08/04 17:53
推 ilms49898723: 範圍算得好好的是好習慣,記得這次只是剛好讓你沒事 08/04 19:05
→ LiloHuang: Linux 上 malloc 會根據配置大小來決定用 brk 或 mmap 08/04 22:13
→ LiloHuang: glibc 有 malloc_usable_size 但也請慎用就是 08/04 22:13
推 b0920075: 看緩衝區溢位的時候有提過申請空間得到的會比原本來的多 08/05 10:20
→ b0920075: ,可是大小不知道多少,是這個意思吧 08/05 10:20
推 steve1012: 不可能每次都要剛剛好 一定會多要為了效率 08/05 10:26
→ steve1012: memory poool就是自己掌控多要多少 啥時還回去來提升 08/05 10:26
→ steve1012: 效率 08/05 10:27
→ steve1012: 常用的像一次要一個page 和free list 08/05 10:27
→ freef1y3: heap要segmentation fault可能要overflow之後 08/05 11:22
→ freef1y3: 又呼叫malloc/free比較容易發生 08/05 11:23
→ shadow0326: 原來是strcat 我看成strcpy (遮臉 08/05 17:02
→ HolyBugTw: 你可以另外宣告一個指標在str後面一點點,然後一樣給值 08/05 17:40
→ HolyBugTw: 再去亂玩str,馬上就會理解問題了 08/05 17:41
推 Zero0910: 你只買了一張火車票 但是把行李放在隔壁的座位上 08/05 17:58
→ Zero0910: 會不會被趕? 不知道 運氣好就放到下車 運氣不好就被趕 08/05 17:59
推 jerryh001: 應該是運氣不好別人直接一屁股坐在你行李上XD 08/05 23:14
推 s25g5d4: 我怎麼覺得坐下去整台火車就炸了 XD 08/06 01:01
推 Thelink: 原po可看看虛擬記憶體映射,上面的code說不定把別的mallo 08/07 13:07
→ Thelink: c 數值改了 08/07 13:08
推 bluesoul: 越界本來就不一定爆炸 08/12 20:15
推 youtuuube000: 一堆人比喻的內容根本看不懂.. 10/21 04:30
→ youtuuube000: 不就os call malloc 都會偷拿額外的memory 嗎? 因 10/21 04:33
→ youtuuube000: 為每次用system call都是很大的cost 系統為了省時間 10/21 04:33
→ youtuuube000: 才會有這種機制 10/21 04:33
→ youtuuube000: 這樣你下一次用malloc很快就會拿到了 10/21 04:34