在封装了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 做参数后,相当于将指针的地址做参数传入,这时再操作改变的就是我们希望变化的指针
所以在希望将某个指针的值传出时,传入的参数必须是一个指针的指针,这样才能达到改变传入指针值的目的
暂时想到这些,不管对错,挖坑待填...