[問題] 動態三維陣列(C)

看板C_and_CPP (C/C++)作者 (得罪了方丈還想走)時間15年前 (2010/12/07 21:38), 編輯推噓2(2037)
留言39則, 6人參與, 最新討論串1/2 (看更多)
想請問版上先進如果只用一個malloc()的動態三維陣列要如何撰寫!? 參考了網路資料 int **Array, *pData; Array= (int **)malloc(m*sizeof(int *)+m*n*sizeof(int)); for (i=0,pData= (int *)(Array+m); i<m; i++, pData+=n) Array[i]=pData; ----------------------------------------------------- 所以就很直覺的寫了 space3d = (unsigned char ***)malloc(Time * sizeof(char **) + Time * Height * sizeof(char *) + Time * Height * Width * sizeof(char)); for(i = 0, space2d = (unsigned char **)(space3d + Time); i < Time; i++, space2d += Height) space3d[i] = space2d; for(i = 0, space1d = (unsigned char *)(space2d + Time * Height); i < Time * Height; i++, space1d += Width) space2d[i] = space1d; 結果...當然出現了問題。 所以想請教版上的先進要如何撰寫才正確!?謝謝。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 210.240.245.74

12/07 21:39, , 1F
我想建議你用置底文的網址,貼上完整的程式碼
12/07 21:39, 1F

12/07 21:44, , 2F
二維的你會嗎
12/07 21:44, 2F

12/07 21:45, , 3F
要不要試試用c++的 new ? 感覺new比較直接一點XD
12/07 21:45, 3F

12/07 21:47, , 4F
j大,主體就貼上的哪些,目前還在練習的階段中。
12/07 21:47, 4F

12/07 21:47, , 5F
不相等的東西...不要隨便用比較好
12/07 21:47, 5F

12/07 21:49, , 6F
l大,二維大致了解,三維就打結了!
12/07 21:49, 6F

12/07 21:52, , 7F
w大,目前只能用C撰寫!!所以...XD
12/07 21:52, 7F

12/07 22:00, , 8F
用typeof跟struct簡化架構
12/07 22:00, 8F

12/07 22:01, , 9F
http://nopaste.csie.org/c0d2e 大概像這個樣子...
12/07 22:01, 9F

12/07 22:03, , 10F
我會希望你用置底網址貼,是因為現在貼的那樣很難看
12/07 22:03, 10F

12/07 22:14, , 11F

12/07 22:17, , 12F
的確清晰多了!謝,j大提醒。
12/07 22:17, 12F

12/07 22:29, , 13F
請問s大有參考的網站嗎!?這方法沒有想過。謝!
12/07 22:29, 13F

12/07 23:02, , 14F
問題可能出在space2d跟space1d的型態
12/07 23:02, 14F

12/07 23:06, , 15F
space2d是char**,所以每次加Heightxsizeof(char**)
12/07 23:06, 15F

12/07 23:07, , 16F
可是你期望的應該是每次加Heightxsizeof(char*)
12/07 23:07, 16F

12/07 23:17, , 17F
space1d則有sizeof(char*)跟sizeof(char)不相等的問題
12/07 23:17, 17F

12/07 23:26, , 18F
腦袋打結,我上面講錯了,不過問題可能還是在char*跟
12/07 23:26, 18F

12/07 23:26, , 19F
char上,現在正在想錯在哪裡
12/07 23:26, 19F

12/08 00:01, , 20F

12/08 00:01, , 21F
實測了一下,第二個for改成這樣就行了
12/08 00:01, 21F

12/08 14:19, , 22F
修正一下,space1d += Width要放裡面迴圈,像下篇寫的
12/08 14:19, 22F

12/08 14:19, , 23F
那樣
12/08 14:19, 23F

12/08 15:55, , 24F
l大,感謝!看完你回的Re更清楚。
12/08 15:55, 24F

12/08 15:57, , 25F
如果datatype是int可以work,如果是unsigned char就無法
12/08 15:57, 25F

12/08 15:59, , 26F
12/08 15:59, 26F

12/08 16:00, , 27F
你有補上轉型的code嗎
12/08 16:00, 27F

12/08 16:00, , 28F
請問l大,可以大概說明一下嗎!?謝謝!
12/08 16:00, 28F

12/08 16:01, , 29F
先跟MaconChou說一聲,你的free錯很大 XD
12/08 16:01, 29F

12/08 16:01, , 30F
把你修改成unsigned char而錯誤的版本貼上來
12/08 16:01, 30F

12/08 16:03, , 31F
你的space1d += Width要放內層的for
12/08 16:03, 31F

12/08 16:05, , 32F

12/08 16:10, , 33F
12/08 16:10, 33F

12/08 16:14, , 34F
請問j大,不是malloc一次,所以free一次!?
12/08 16:14, 34F

12/08 16:15, , 35F
喔喔,是我誤會了,請無視我說你free錯的那行推文
12/08 16:15, 35F

12/08 16:16, , 36F
12/08 16:16, 36F

12/08 16:29, , 37F
j大,不會,還是謝謝你的指教!!
12/08 16:29, 37F

12/08 17:03, , 38F
還是錯誤!目前發現錯誤在free,//free()就可OK,但...
12/08 17:03, 38F

12/08 21:59, , 39F
http://codepad.org/QRL309HX 這樣就可以了
12/08 21:59, 39F
文章代碼(AID): #1C_ZZLwM (C_and_CPP)
文章代碼(AID): #1C_ZZLwM (C_and_CPP)