[问题] 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