看板 C_and_CPP 關於我們 聯絡資訊
( *[1m *[m 為色碼,可以按 Ctrl+V 預覽會顯示的顏色 ) ( 未必需要依照此格式,文章條理清楚即可 ) 遇到的問題: (題意請描述清楚) 如果想將 malloc 的功能擴充 而將 malloc 用函式包起來 這樣寫是不是真的有 malloc 到? 還是其實函式結束後空間就消失了? 開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux) Dev-C++ 有問題的code: (請善用置底文標色功能) #include <stdio.h> int myMalloc(char*); int main() { int *i_ptr; i_ptr = myMalloc("test.txt"); system("PAUSE"); return 0; } int myMalloc(char *filename) { int x; int *i_ptr; //...假設這裏從檔案中取得一些值存入x... i_ptr = (int*)malloc(sizeof(int) * x); return i_ptr; } 補充說明: 有沒有更推薦或是比較標準的作法? 其實有想過可能函式要宣告成 int *myMalloc(char*); 但是感覺這樣好像也是可以... 感謝解答 <(-.-)> -- 想你的時候 不一定能告訴你 如果不告訴你 也能會意 那我們就是有 真正的默契 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.115.48.199
VictorTom:就算是包裝起來, 有用到malloc就還是有用到, 動態配置的 10/27 22:11
VictorTom:特性不會因為包裝過後就消失; 包裝是幫助你更方便使用:) 10/27 22:12
VictorTom:對了, 你的myMalloc應該return int*型態才對吧....@_@" 10/27 22:13
ledia:用完記得要 free, 跟一般使用 malloc 一樣 10/27 22:20
bill42362:想請問一下 return int 和 return int* 差別是...? 10/27 22:52
bill42362:是怕某些系統不是用 int 來存 address ??? 感謝解惑 @@" 10/27 22:52
bill42362:如果要 free 是直接在 main 裡 free 就可以了嗎? 10/27 22:53
bill42362:如果這裏改 return int* 是直接改宣告就好嗎? 10/27 22:54
ledia:沒有用 int 存 int * 這種事, 用哪形態就 return 該種值 10/27 22:56
ledia:既然你回傳的是 int *, 外面也是用 int * 來接, 當然宣告時 10/27 22:56
ledia:就要告訴編譯器你的函式叫 int *myMalloc(char*); 10/27 22:57
ledia:明白指出他是回傳 int * 的... 寫程式沒有 "感覺" 可不可以 10/27 22:57
ledia:free 的話, 在哪裡都可以, 只要確認他有 free 過一次, 而且 10/27 22:58
ledia:在 free 過之後就不能再次使用他了 10/27 22:58
ledia:你要傳進函式裡, 比如說 void myFree(int *); 再 free 也行 10/27 23:00
VictorTom:我覺得原po搞錯了一點, 不同型態不管幾維的pointer它就 10/27 23:35
VictorTom:是pointer, 在不同platform上pointer的bit count可能會 10/27 23:35
VictorTom:不同, 但是*掛在那就是pointer; int*或char*這些, 是指 10/27 23:36
VictorTom:明如何解釋這個address上的資料; 用int直接記錄各種類型 10/27 23:36
VictorTom:pointer指到的address實務上不是沒有地方應用, 但是您的 10/27 23:37
VictorTom:表達似乎對它有一點誤解@_@" 10/27 23:38
VictorTom:其他就如l大推的; 也建議malloc都包裝了, 基於成對style 10/27 23:39
VictorTom:也把free自己包一下吧; 就算只搞得像別名也沒關係, 這與 10/27 23:40
VictorTom:之後維護code時, 幫助你較容易了解code有點關係:) 10/27 23:40
bill42362:喔喔 我了解了 感謝兩位大大解惑 @@" 10/28 02:08
bill42362:原來是我把宣告和回傳方式搞混了 >"< 10/28 02:10