[問題] malloc's buffer size

作者: EngRookie (EngRookie)   2016-08-04 15:50:26
小弟今天突然發現原來自己對 malloc 超級不熟....
舉個例子
char *str = (char *)malloc(sizeof(char));
就我理解他是回傳一個char型態的位址,並且長度為1個 byte
但是我居然可以在裡面塞下很多東西,如下:
strcpy(str, "a");
printf("%s\n", str);
strcat(str, "b");
printf("%s\n", str);
strcat(str, "c");
printf("%s\n", str);
一樣可以印出 a, ab, abc
問題:str的buffer size到底是多少呢? 要怎麼印出來......(已爬文過 T___T
作者: s89227 (Kei)   2016-08-04 16:34:00
不太懂問題,是問只有malloc一個char的str怎麼能strcpy那麼多次沒爆炸嗎?印大小的話,呼叫sizeof再印出來呀?
作者: EngRookie (EngRookie)   2016-08-04 16:47:00
1. 可以編譯也可以執行 2. sizeof 沒辦法印出malloc
作者: Caesar08 (Caesar)   2016-08-04 16:48:00
1但你應該malloc(sizeof(char)+1)因為你一直copy到同個位置
作者: shadow0326 (非議)   2016-08-04 16:59:00
為什麼我只有一個杯子 每天卻可以喝那麼多水
作者: bibo9901 (function(){})()   2016-08-04 17:16:00
你租一間套房但自己把牆壁打掉佔用隔壁間 有沒有問題?在房客回來或房東報警前當然是沒有啦...
作者: Caesar08 (Caesar)   2016-08-04 17:24:00
如果你的str是"a\0",那strcat就會放在str+1如果你的str是a,沒有null-terminated character,那就是undefined behavior
作者: Bencrie   2016-08-04 17:34:00
原 po 只是單純想問存取越界為什麼不會爆炸吧
作者: s25g5d4 (function(){})()   2016-08-04 17:35:00
這問題很深 要從 data segement, heap, brk() systemcall 開始說起你可以想像 brk() 會跟 OS 要多一點的 heap 空間但是呼叫這樣一個 system call 是需要時間的所以 malloc() 傾向拿多一點的空間 而不會拿剛剛好但是使用者呼叫 malloc(sizeof char) 就只有要求 1 btye所以 malloc 本身的紀錄會僅有 1 byte 被用掉但事實上因為空間有多要一點 所以後面是很可能可以存取的但這是 undefined behavior, 沒有人可以保證會發生甚麼事如果你剛好用完 brk() 要到的空間 接下來就噴 segementfault 了
作者: crazycy (LCY)   2016-08-04 17:40:00
樓上強者大大Orz
作者: s25g5d4 (function(){})()   2016-08-04 17:40:00
樓上廚
作者: james732 (好人超)   2016-08-04 17:53:00
你只租了一間房間,但是你的東西擺到隔壁去了
作者: ilms49898723 (LittleBird)   2016-08-04 19:05:00
範圍算得好好的是好習慣,記得這次只是剛好讓你沒事
作者: LiloHuang (十年一刻)   2016-08-04 22:10:00
Windows 上有 _msize() https://goo.gl/e4uFgA 請慎用Linux 上 malloc 會根據配置大小來決定用 brk 或 mmapglibc 有 malloc_usable_size 但也請慎用就是
作者: b0920075 (Void)   2016-08-05 10:20:00
看緩衝區溢位的時候有提過申請空間得到的會比原本來的多,可是大小不知道多少,是這個意思吧
作者: steve1012 (steve)   2016-08-05 10:26:00
不可能每次都要剛剛好 一定會多要為了效率memory poool就是自己掌控多要多少 啥時還回去來提升效率常用的像一次要一個page 和free list
作者: freef1y3 ( )   2016-08-05 11:22:00
heap要segmentation fault可能要overflow之後又呼叫malloc/free比較容易發生
作者: shadow0326 (非議)   2016-08-05 17:02:00
原來是strcat 我看成strcpy (遮臉
作者: HolyBugTw (HolyBug)   2016-08-05 17:40:00
你可以另外宣告一個指標在str後面一點點,然後一樣給值再去亂玩str,馬上就會理解問題了
作者: Zero0910 (みくに最高≧▽≦)   2016-08-05 17:58:00
你只買了一張火車票 但是把行李放在隔壁的座位上會不會被趕? 不知道 運氣好就放到下車 運氣不好就被趕
作者: jerryh001   2016-08-05 23:14:00
應該是運氣不好別人直接一屁股坐在你行李上XD
作者: s25g5d4 (function(){})()   2016-08-06 01:01:00
我怎麼覺得坐下去整台火車就炸了 XD
作者: Thelink (Thelink)   2016-08-07 13:07:00
原po可看看虛擬記憶體映射,上面的code說不定把別的malloc 數值改了
作者: bluesoul (忙死你老爸)   2016-08-12 20:15:00
越界本來就不一定爆炸

Links booklink

Contact Us: admin [ a t ] ucptt.com