Re: [問題] 如何輸出const void ** 參數?
※ 引述《LPH66 (-858993460)》之銘言:
: ※ 引述《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;)
這樣會出現下列錯誤
expected ‘const void **’ but argument is of type ‘const char **’
不會還是謝謝大大的觀念釐清
: 差別在於 const char * 這個宣告給了你自己提示說"抓回來的是個字串"
: 這樣一來自然不會有這篇的問題
: ---
: 至於說到為什麼函式的設計者不乾脆寫 const char **
: 我從文件中的 "for string entries" 來猜
: 也許回傳值不只是字串 可能還是別的東西
: 或許它抓到的值可能是個 int 等等
: 那像這種時候 因為呼叫方知道自己要抓的是個 int
: 應該要宣告一個 const int * 丟進去才行
: 這樣呼叫方自己會知道"我抓到了一個 int 回來" 後續利用上也就不會有問題了
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.116.1.134
推
03/21 14:43, , 1F
03/21 14:43, 1F
→
03/21 14:45, , 2F
03/21 14:45, 2F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 3 之 3 篇):