看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) linux 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) stdlib 問題(Question): 在網路上看到了一個動態宣告二維陣列的方式 大致上已經了解在做甚麼 不過無法理解的是明明a是一個void** 可是function的return type卻是void* 我的想法是void*可以是指向任何型態的指標,所以應該也包括指向指標的指標 不過這樣想的話所有的void**都應該可以用void*來取代阿 不過實際上如果把綠色的部分都改成void* compile不會過 把紅色的改成void**的話compiler會過,但是會出現warning 請問為什麼a是void**,function的return type卻是void*呢? 程式碼(Code):(請善用置底文網頁, 記得排版) void* malloc2Darray(int h,int w,int size) { int i; void** a = (void**) malloc ( h*sizeof(void*) + h*w*size ) for(i=0;i<h;i++) a[i] = ((char*)(a+h)) + i*w*size; return a; } 補充說明(Supplement): -- ────╮ ╮ ╮╭──┬╭─┬─╯┬── ──╮ ╭╯ │ ││ │ 幹!考試讀不完! /\ <●╰────┼──┤├──┤ ├─★黑特嗎? φ /> │ ││ │ │ ╭───╮ /| ╰ ╰╯ ╰ ╰──╯ ╭╯ ﹀\﹀ 臣亮言:先帝創業未半,而中道崩殂。今天下... ξwinken2004╰────────/\─╯ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.249.170
LPH66:我覺得是回傳型態寫錯了...這個回傳型態應該要是 void** 11/01 01:11
shemale:同樓上。原po指標觀念仍不夠清楚,試試畫圖 11/01 08:10
azureblaze:另外void*可以吃大部分的指標,包括void** 11/01 11:11
在網路上看了幾個資料 回傳型態確實是void* http://ppt.cc/QL-_ 我後來把後面的所有評論大致瀏覽過後 大概可以理解為啥是void* 其實跟我想得差不多,void*可以是指向任何型態的指標 所以也包括指向指標的指標 至於為啥void**會出現warming,可能是寫compiler的人不希望我們這樣寫吧? 我在猜compiler可能希望function回傳不知道指向甚麼型態的指標的時候 都固定回傳void*,而不是void**或是void***之類的 反正到時候再用cast轉換成(int **)或是(char **)之類的就可以了 我還沒修到compiler就是了... 後來用不同的compiler,return type用void**結果也沒出現warning XD 而且我自己觀察就算有warning程式也可以正確地跑就是了... 雖然不知道會不會哪天爆炸XD 至於把綠色的部分改成void* 應該只是我癡心妄想而已吧XD 有一點把compiler想像成無所不能的東西了 只是抱持著好奇好玩的心情這樣改的 就算可以過我也不敢這樣用XD ※ 編輯: winken2004 來自: 140.113.249.170 (11/01 16:34)
Feis:綠色部分是肯定不能這樣做的. a[i] 的型態會是 void 11/01 16:45
Feis:何況 void * 是不能做指標的算術運算的 (+, -) 11/01 16:46
ah7675:warning 11/01 21:17
阿 感謝XD ※ 編輯: winken2004 來自: 140.113.249.170 (11/01 22:15)