Weird sqLite database string file path error
So, I'm planning to use sqlite3 to update skype's main.db file.
I use sqlite3_open function to open the connection like this.
int rc = sqlite3_open(filepath,db);
I'm trying to do the filepath string dynamically, but a weird error is driving me crazy.
I have two strings szFile and szFilePath, szFile being a test string which will contain the actual path of the db file, and szFilePath is the same string only this time dynamically generated by a function.
The thing is just before the execution of 开发者_JAVA技巧sqlite3_open function, both strings as you see on the screenshot are identical, I even posted memory for you to see.
Look at pictures: Picture 1 Picture 2
Now, despite being completely identical, no matter how many times I run this code ONLY szFile works, with the other one giving me a "cannot open file path" error, and completely confusing me. Also, I don't no if this is normal, but by setting a breakpoint at the next if, I can see that szFilePath loses it's value (is filled with c hex values).
What could be wrong?
You're returning a char* that points to an array on the stack - as soon as you return from the function szGetFilePath
, this pointer is quite possibly pointing to junk (it will definitely point to junk after a couple of levels of additional calls - when the values on the stack are overwritten).
You can either return a dynamically allocated array of char (i.e. malloc
ed) from the function (and remember to free
it later), or pass a pointer to a char array through to szGetFilePath
and put the character data into this.
C isn't my strong point but are you perhaps not sending through a UTF-16 string to a function that accepts a UTF-8 string?
http://sqlite.org/c3ref/open.html
szGetFilePath
is returning the reference of a local variable(szPathAppData
). On returning from the function call, unwinding of the stack begins.
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) ;
精彩评论