[問題] 宣告陣列來做類似mempool用法?

看板C_and_CPP (C/C++)作者 (法蘭蘇)時間15年前 (2010/09/04 14:24), 編輯推噓0(0022)
留言22則, 2人參與, 最新討論串1/1
( *[1m *[m 為色碼,可以按 Ctrl+V 預覽會顯示的顏色 ) ( 未必需要依照此格式,文章條理清楚即可 ) 遇到的問題: (題意請描述清楚) 想請問下面的想法是否可行? char **image[3]; char pool[BUF_SIZE]; buffer_offset=0; 如果我不想用malloc來分配記憶體, 而是使用現有的pool陣列來作分配 就像下面的寫法, 雖然囉唆 但是大概就是這樣寫 image[0]=(char**)&pool[buffer_offset]; buffer_offset+=sizeof(char*)*height; //height 是想要分配的高度 for(int i=0;i<height;i++) { image[0][i]=(char*)&pool[buffet_offset]; buffer_offset+=sizeof(char)*width; //width 是想分配的寬度 } image[1] 與 [2] 也是用類似的作法 不知道這樣的作法是否可行?? 希望得到的正確結果: 希望能夠用image[i][j][k]來操作... 程式跑出來的錯誤結果: 開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux) 有問題的code: (請善用置底文標色功能) 補充說明: -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 115.43.225.109

09/04 17:28, , 1F
image[0]=(char**)&pool[buffer_offset]; 這邊型態不
09/04 17:28, 1F

09/04 17:29, , 2F
一致, 就算你成功的轉型成char**, dereference 出來的
09/04 17:29, 2F

09/04 17:29, , 3F
image[0][i] 型態是不折不扣的 char, 後面的賦值完全
09/04 17:29, 3F

09/04 17:29, , 4F
不合理
09/04 17:29, 4F

09/04 18:10, , 5F
除了maintain一個char array, 為了支援多維的情況, 還
09/04 18:10, 5F

09/04 18:11, , 6F
需要再增加char*、char**等的陣列, 來儲存更多配置的
09/04 18:11, 6F

09/04 18:12, , 7F
資訊, 而多維指標的語法:image[i][j][k], 透過多層的
09/04 18:12, 7F

09/04 18:12, , 8F
指標 dereferenc 來達成, 如果不要這麼複雜, 自己依照
09/04 18:12, 8F

09/04 18:14, , 9F
row/col major 自己寫一個巨集來存取也是可以的, 只是
09/04 18:14, 9F

09/04 18:14, , 10F
執行速度會慢一些
09/04 18:14, 10F

09/04 18:15, , 11F
建議的二維版本 http://codepad.org/RxfPcSOa
09/04 18:15, 11F

09/04 23:15, , 12F
謝謝love大的說明, 果然這樣有問題
09/04 23:15, 12F

09/04 23:31, , 13F
我以為那樣轉型為char**,他其實會把那pool裡面的位置
09/04 23:31, 13F

09/04 23:32, , 14F
當作char**來用,也就是4bytes,沒想到 他還是會當作
09/04 23:32, 14F

09/04 23:32, , 15F
char來用,這就是盲點了
09/04 23:32, 15F

09/04 23:34, , 16F
不知道 malloc函式是怎樣實做的,他出來的型態是void*
09/04 23:34, 16F

09/04 23:37, , 17F
你可以用google code search來搜尋一下原始碼, 其實雖
09/04 23:37, 17F

09/04 23:38, , 18F
然你轉會過, 但是在考慮dereference時, image[0][i]
09/04 23:38, 18F

09/04 23:38, , 19F
雖然型態你想把他強制當成是char*, 但是實際上是char
09/04 23:38, 19F

09/04 23:39, , 20F
因為指標的大小差不多會大於1Byte, 多的部份會被截掉
09/04 23:39, 20F

09/04 23:40, , 21F
如果你想用夠大的變數硬當指標來用也是可以...只是很
09/04 23:40, 21F

09/04 23:40, , 22F
噁心
09/04 23:40, 22F
文章代碼(AID): #1CWUOpYI (C_and_CPP)
文章代碼(AID): #1CWUOpYI (C_and_CPP)