[問題] 另一種方式的動態配置二維陣列…

看板C_and_CPP作者 (GG)時間15年前 (2009/06/22 21:47), 編輯推噓1(1012)
留言13則, 3人參與, 最新討論串1/3 (看更多)
最近在網路上看到一篇動態配置二維陣列的方法… 我想這邊可能有很多人看過了…但是有一個地方看不太懂…所以想請問大家一下… 參考網址/文章來源:http://smalldd.pixnet.net/blog/post/10953132 在配置的函式裡面的下面幾行 p = (void**)new char[h*sizeof(void*) + h*w*size]; for(i = 0; i < h; i++) { p[i] = ((char *)(p + h)) + i*w*size; } p[i]是從p+h的位址開始…而我的問題是為什麼不直接從p的位置當做p[i]… 也就是在new的時後…為什麼要多new h*sizeof(void*)這段空間… 我試過用BCB跑過上面的程式…的確p+h這一段是浪費掉了…一直想不透… 不知道有沒有高手能夠解釋一下…感謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.169.113.65

06/22 22:09, , 1F
那一段要看怎樣用, 才知道會不會浪費....
06/22 22:09, 1F

06/22 22:09, , 2F
這樣做有一個好處是, 你用一個cast, 就可以把p當成二維
06/22 22:09, 2F

06/22 22:10, , 3F
陣列來用, p~p+h這一段就相當於二維陣列每一個row的頭.
06/22 22:10, 3F

06/22 22:12, , 4F
一般動態二維陣列要經過兩次new, 一次配char*[], 再一個
06/22 22:12, 4F

06/22 22:12, , 5F
loop配char[]; 一維模擬二維, 自然有一個基底的char[],
06/22 22:12, 5F

06/22 22:13, , 6F
然後還是得new一個char*[]跑迴圈一個一個指上去....
06/22 22:13, 6F

06/22 22:13, , 7F
它這樣寫法的好處就是, new跟delete只需要一次....
06/22 22:13, 7F

06/22 22:14, , 8F
它把char*[]需要的空間與char[]需要的空間一起new完了.
06/22 22:14, 8F

06/22 22:14, , 9F
如果小弟上面廢話這麼多您還是不明白p~p+h的用途....
06/22 22:14, 9F

06/22 22:15, , 10F
建議您自己試著算算看, 要動態配置出char [h][w]的二維
06/22 22:15, 10F

06/22 22:15, , 11F
陣列總共需要多少new來的空間, 這樣應該就會明白了:)
06/22 22:15, 11F

06/22 22:32, , 12F
感謝你的解釋…雖然看不太懂…但我會在想看看@@
06/22 22:32, 12F

06/23 01:12, , 13F
p+h使用在p[i]處,沒有浪費掉;拿掉就只是一維上的[h*w]
06/23 01:12, 13F
文章代碼(AID): #1AFujbF- (C_and_CPP)
文章代碼(AID): #1AFujbF- (C_and_CPP)