看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《CSLabor (電腦工人)》之銘言: : → stupid0319:pa_proplist_get << 我對這個有意見 03/21 12:01 : → stupid0319:我覺的你的const void **data跟本沒有東西 03/21 12:03 : → CSLabor:http://0rz.tw/GkWYQ 03/21 12:06 : → stupid0319:也就是空指標,我亂猜的 03/21 12:06 : → stupid0319:const void *data;表示data是不給修改的 03/21 12:18 : → stupid0319:卻又傳data的指標給含數,那不是很奇怪嗎? 03/21 12:19 : → stupid0319:data的內容是固定的才對,不會被任何的含數修改 03/21 12:19 : → CSLabor:解決了 用strcpy 03/21 12:20 在這個連結之後我才搞懂你的問題是什麼.... 首先先來看你貼的這個連結: int pa_proplist_get ( pa_proplist * p, const char * key, const void ** data, size_t * nbytes ) Return the the value for the specified key. Will return a NUL-terminated string for string entries. The pointer returned will point to an internally allocated buffer. The caller should make a copy of the data before the property list is accessed again. 如你所知 它的用法是傳入一個指標變數的位址 然後這函數會把這指標變數指向一個函式內部的空間 其內容長度則是用 nbytes 傳回來 你原程式的用法一點都沒錯 問題在於你被它參數列上的 const void ** 給弄混了 它其實是一個指標變數 (void *) 的 "call by address" (雖然我個人很討厭這詞但在這裡這麼說比較快) 函式結束之後這裡將會"傳回來"一個 void * 指標 指向的就是實際傳回來的資料 那麼這裡你就要看你所要的資料是什麼了 如果是字串的話 它有說"Will return a NUL-terminated string for string entries" 這表示這個 void * 在這個情形裡會指向一個以 NUL 結束的字串 因此這種情形時正確的用法其實不是宣告一個 const void * 丟進去 而是宣告一個 const char * 丟進去 (ie. 你的 code 的第九行改宣告為 const char * data;) 差別在於 const char * 這個宣告給了你自己提示說"抓回來的是個字串" 這樣一來自然不會有這篇的問題 --- 至於說到為什麼函式的設計者不乾脆寫 const char ** 我從文件中的 "for string entries" 來猜 也許回傳值不只是字串 可能還是別的東西 或許它抓到的值可能是個 int 等等 那像這種時候 因為呼叫方知道自己要抓的是個 int 應該要宣告一個 const int * 丟進去才行 這樣呼叫方自己會知道"我抓到了一個 int 回來" 後續利用上也就不會有問題了 -- いああオレたちには見えてるモノがあるbきっと誰にも奪われないモノがあるはずさ開口一番一虚一実跳梁跋扈形影相弔yL羊頭狗肉東奔西走国士無双南柯之夢 歪も ぶ  意味がないと思えるコトがあるPきっとでも意図はそこに必ずある んの く 依依恋恋空前絶後疾風怒濤有無相生H急転直下物情騷然愚者一得相思相愛 だが ろ 無意味じゃない6あの意図 恋た で 有為転変死生有命蒼天已死黄天當立 !!6五里霧中解散宣言千錯万綜則天去私 のり -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.28.92 ※ 編輯: LPH66 來自: 140.112.28.92 (03/21 12:57)