所以,我打算用sqlite3来更新skype的main.db文件。
我使用sqlite3_open函数打开这样的连接。
int rc = sqlite3_open(filepath,db);
我正在尝试动态地执行文件路径字符串,但是一个奇怪的错误让我发疯。
我有两个字符串szFile和szFilePath,szFile是一个测试字符串,它将包含db文件的实际路径,而szFilePath只是一个函数动态生成的字符串。
事情就在执行sqlite3_open函数之前,截图中的两个字符串都是相同的,我甚至发布了内存供你查看。
现在,尽管完全相同,无论我运行此代码多少次,只有szFile工作,另一个给我一个“无法打开文件路径”错误,并完全让我困惑。另外,如果这是正常的话,我不会这样做,但是通过在下一个设置断点,我可以看到szFilePath丢失了它的值(用十六进制值填充)。
可能出现什么问题?
答案 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) ;