奇怪的sqLite数据库字符串文件路径错误

时间:2011-06-05 18:08:24

标签: c string sqlite

所以,我打算用sqlite3来更新skype的main.db文件。

我使用sqlite3_open函数打开这样的连接。

int rc = sqlite3_open(filepath,db);

我正在尝试动态地执行文件路径字符串,但是一个奇怪的错误让我发疯。

我有两个字符串szFile和szFilePath,szFile是一个测试字符串,它将包含db文件的实际路径,而szFilePath只是一个函数动态生成的字符串。

事情就在执行sqlite3_open函数之前,截图中的两个字符串都是相同的,我甚至发布了内存供你查看。

看图片: Picture 1 Picture 2

现在,尽管完全相同,无论我运行此代码多少次,只有szFile工作,另一个给我一个“无法打开文件路径”错误,并完全让我困惑。另外,如果这是正常的话,我不会这样做,但是通过在下一个设置断点,我可以看到szFilePath丢失了它的值(用十六进制值填充)。

可能出现什么问题?

3 个答案:

答案 0 :(得分:2)

你正在返回一个指向堆栈的char * - 一旦从函数szGetFilePath返回,这个指针很可能指向垃圾(它肯定会在几个额外的调用之后指向垃圾 - 当堆栈上的值被覆盖时。)

你可以从函数中返回一个动态分配的char数组(即malloc ed)(并记得稍后再记free),或者将一个指向char数组的指针传递给{{ 1}}并将字符数据放入其中。

答案 1 :(得分:0)

C不是我的强项,但你是不是可以通过UTF-16字符串发送到接受UTF-8字符串的函数?
http://sqlite.org/c3ref/open.html

答案 2 :(得分:0)

szGetFilePath返回局部变量(szPathAppData)的引用。从函数调用返回时,堆栈的展开开始。

 char* szGetFilePath( char* szAccountName )
 {
     char *szPathAppData = calloc(128,1) ; // Allocating memory on heap
     // ....

     return szPathAppData ;
 }

  // You need to free the resources acquired on heap by using free.
  //  free(szPathAppData) ;