Re: [問題] 指標的指標

作者: sarafciel (Cattuz)   2018-05-28 23:55:20
※ 引述《zzss2003 (brotherD)》之銘言:
: 開發平台(Platform): Win7
: 編譯器: GCC
: 額外使用到的函數庫(Library Used): No
: 問題(Question): int **arr = (int**)malloc(c*sizeof(int))
: 程式碼(Code):https://ideone.com/e.js/kHRJmp
: 第八行(int **arr)做完小弟的理解是像這樣: https://imgur.com/a/d6kJniE
: 其中ABC因為還沒有給值,所以用變數表示。
: 當執行arr = (int**)malloc(c*sizeof(int*))
: malloc所給予的是一個ptr,這個ptr是指向**int,所以這個ptr的value就會取代A所以圖就變成這樣(圖二): https://imgur.com/a/d6kJniE
: 問題:
: 1. malloc最後所allocate的大小是3*4bytes = 12bytes,但在我畫的圖中,B的size只有
: 4bytes,要如何放得下12bytes?
: 謝謝
因為你誤解指標了,而且圖也沒畫對XD
指標裡面存的東西是位置,32bit的機器上就是4byte,64bit的機器上就是8byte
當你做malloc的時候實際上是在heap要一塊記憶體,然後把這塊記憶體的開頭位置給指標
打個爛比方,某人A有4坪的連號房子三棟,而B(指標)所謂的"知道A的地址"這件事
不是把三棟房子的位置抄在12坪上
而是把第一棟房子的位置抄在自己的4坪上,如果你要找A的第二棟房子
那就自己走到第一棟的位置 再走4坪的路這樣
而要走幾坪的路這件事 編譯器會幫你搞定
所以如果你在32bit的機器上寫一個(int *)型態的ptr做++,
或是用陣列存取的方式(ptr[0]、ptr[1]....ptr[i])
前者實際上在底層的組語是在做ptr+4,後者就是ptr+4*i
所以你上面那段code畫成圖實際上是長這樣,本人字醜拜託不要嗆我QQ
(圖上的記憶體位置只是舉例而已,請不要當真)
https://imgur.com/a/Qa84v2x
大概是這樣
作者: MOONRAKER (㊣牛鶴鰻毛人)   2018-05-29 08:07:00
手工圖片推一個 XD
作者: jojojen (JJJ)   2018-05-29 11:47:00

Links booklink

Contact Us: admin [ a t ] ucptt.com