ᴘᴀɴᴀʏɪᴏᴛɪs
ᴘᴀɴᴀʏɪᴏᴛɪs

Reputation: 7529

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 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?

Upvotes: 1

Views: 177

Answers (3)

Mahesh
Mahesh

Reputation: 34625

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

Upvotes: 0

Eminem
Eminem

Reputation: 7484

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

Upvotes: 0

Will A
Will A

Reputation: 24998

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. malloced) 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.

Upvotes: 2

Related Questions