※ 引述《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デ きっと誰にも奪われないモノがあるはずさ
け 開口一番一虚一実跳梁跋扈形影相弔yュL羊頭狗肉東奔西走国士無双南柯之夢 歪も
ぶ 意味がないと思えるコトがある ラPきっとでも意図はそこに必ずある んの
く 依依恋恋空前絶後疾風怒濤有無相生 ラH急転直下物情騷然愚者一得相思相愛 だが
ろ 無意味じゃない ラ6あの意図が 恋た
で 有為転変死生有命蒼天已死黄天當立 !!6五里霧中解散宣言千錯万綜則天去私 のり
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.28.92
※ 編輯: LPH66 來自: 140.112.28.92 (03/21 12:57)