覆轍 使用指標獲取類私有變數

2021-06-07 06:27:24 字數 1724 閱讀 8163

在封裝了sqlite的介面後,使用find時,需要將所查詢到的資料返回

在封裝的介面中,查詢結果是作為類成員的私有變數存放的

int nrow, ncolumn;       /*! 查詢結果的行列 */

char **azresult; /*! sqlite的查詢結果表 */

在介面中,使用了傳入的指標引數來獲取查詢結果 

datafind(char *filepath, int mode, int rowandcolumn[2], char **result);

在介面外對result進行操作即可以得到所查詢的結果

但在實際執行過程中,當從result獲取結果時,發生段錯誤

介面中的描述為

rowandcolumn[0] = nrow;         /*! 返回行數 */

rowandcolumn[1] = ncolumn; /*! 返回列數 */

result = azresult; /*! 返回查詢到的資料陣列,第一行為欄位名 */

肉眼沒有發現問題,想到在介面內將兩個二維陣列的位址列印出來檢視 

printf("%p\n",azresult);

printf("%p\n", result);

得到的位址也是一樣

0xa168064

0xa168064

但在介面外列印result的位址時,得到的是

(nil)

發現位址並沒有被傳出來

突然想到函式在傳遞引數時的位址問題,將傳入引數改為

datafind(char *filepath, int mode, int rowandcolumn[2], char ***result);

介面內更改為

rowandcolumn[0] = nrow;         /*! 返回行數 */

rowandcolumn[1] = ncolumn; /*! 返回列數 */

*result = azresult; /*! 返回查詢到的資料陣列,第一行為欄位名 */

然後再列印位址檢視,發現介面內兩個位址不一樣

0x83be02c

0xbfccde7c

但是介面外列印的位址為

0x83be02c

與需要的結果位址一致

此時再對result進行操作獲取查詢結果,成功的得到資料

思考一番得到如下:

開始使用 char **result 做引數時,在函式體內改變的並不是其指標本身,而是指標內指向的位置
使用 char ***result 做引數後,相當於將指標的位址做引數傳入,這時再操作改變的就是我們希望變化的指標
所以在希望將某個指標的值傳出時,傳入的引數必須是乙個指標的指標,這樣才能達到改變傳入指標值的目的

暫時想到這些,不管對錯,挖坑待填...

獲取類中的私有變數

當反射呼叫dll時,我們可能想要獲取類中對應的私有變數,但是普通的呼叫是看不到私有變數,需要我們做進一步處理 命名空間 using system.reflection public static class getprivateex public static t getprivatepropert...

類的私有變數

1.在python 中可以通過在屬性變數名前加上雙下劃線定義屬性為私有屬性 特殊變數命名 案例 class a object zhe shi shuo ming name ling man def hello self print self.name print self.def get self ...

類物件 私有變數

類及物件 class critter object a virtual pet deftalk self print hi,i m instance of class critter.crit critter crit.talk hi,i m instance of class critter.構造...