2011-06-05 119 views
1

所以,我打算使用sqlite3来更新skype的main.db文件。奇怪的sqLite数据库字符串文件路径错误

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

int rc = sqlite3_open(filepath,db); 

我想动态地做文件路径字符串,但一个奇怪的错误让我发疯。

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

这个东西就在执行sqlite3_open函数之前,两个字符串就像你在屏幕截图上看到的一样,我甚至会发布内存供你查看。

看图片: Picture 1 Picture 2

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

什么可能是错的?

回答

2

你返回一个char *指向数组堆栈上 - 只要你从函数返回szGetFilePath,这个指针很可能是指向垃圾(它肯定会指向垃圾一对夫妇后的额外调用级别 - 当堆栈中的值被覆盖时)。

可以要么返回炭从函数动态分配的数组(即malloc ED)(后来记得free它),或者通过将指针传递到一个char阵列szGetFilePath,把字符数据到这一点。

+0

那么如何让它指向堆上的数组呢? – 2011-06-05 18:12:49

+0

@Panayiotis - 回答修改给你几个选项。 – 2011-06-05 18:16:27

+0

非常感谢!尽管我想知道如何通过动态分配来完成它,但我仍然设法让它与第二个选项一起工作。 您是否会友善地给我一个关于如何使用malloc来做的代码示例? – 2011-06-05 18:28:56

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) ; 
+0

非常感谢代码!正是我在找:) – 2011-06-05 18:32:09

+0

@Mahesh如果szPathAppDate不存在函数范围之外,我将如何释放资源?我也遇到了一些令人讨厌的堆异常。 – 2011-06-05 18:39:37

+0

@Panayiotis - 我不知道我是否正确理解你。你只是返回一个指向堆上位置的指针。你应该可以通过收集它的变量释放它。顺便说一下,'szPathAppData'指向的数据是否以null结束?('\ 0') – Mahesh 2011-06-05 18:46:26