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