开发者

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


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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜