PTT
Submit
Submit
选择语言
正體中文
简体中文
PTT
C_and_CPP
[问题] 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
越界本来就不一定爆炸
继续阅读
[问题] 括号匹配问题
hth9494
[问题]如何透过OA lotus send email
funky1221
[问题] 资料流的意思?
bald
[问题] Offset
Qoofate
Re: [问题] 把 vector 传给 printf
descent
Re: [讨论] 让programmer控制variable所需的bit数?
wtchen
Re: [问题] 如何化简被function的vector?(解决)
Clangpp
[问题] 把 vector 传给 printf
descent
[讨论] 让programmer控制variable所需的bit数?
Caesar08
[问题] 判断类别是否有某种属性?
noodleT
Links
booklink
Contact Us: admin [ a t ] ucptt.com