Re: [問題] 指標的指標

看板C_and_CPP作者 (Cattuz)時間6年前 (2018/05/28 23:55), 編輯推噓2(200)
留言2則, 2人參與, 6年前最新討論串2/3 (看更多)
※ 引述《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 大概是這樣 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.193.54.11 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1527522924.A.276.html

05/29 08:07, 6年前 , 1F
手工圖片推一個 XD
05/29 08:07, 1F

05/29 11:47, 6年前 , 2F
05/29 11:47, 2F
文章代碼(AID): #1R32Pi9s (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1R32Pi9s (C_and_CPP)