Take the 2-minute tour ×

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?

share|improve this question
add comment

3 Answers

up vote 2 down vote accepted

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.

share|improve this answer
So how do I make it point to an array on the heap? –  Panayiotis Jun 5 '11 at 18:12
@Panayiotis - answer modified to give you a couple of options. –  Will A Jun 5 '11 at 18:16
Thanks a lot! Managed to get it working with the second option, although I would like to know how to do it with dynamic allocation as well. Would you be kind enough to give me a code example of how to do it with malloc? –  Panayiotis Jun 5 '11 at 18:28
add comment

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) ;
share|improve this answer
Thanks a lot for the code! Just what I was looking for :) –  Panayiotis Jun 5 '11 at 18:32
@Mahesh How will I free up the resources, if szPathAppDate does not exist outside the function scope? I'm getting some nasty heap exceptions as well. –  Panayiotis Jun 5 '11 at 18:39
@Panayiotis - I am not sure I correctly understood you. You are just returning a pointer to the location on the heap. And you should be able to free via the variable that collects it. BTW, is the data pointed by szPathAppData null terminated ? (\0) –  Mahesh Jun 5 '11 at 18:46
@Mahesh Yes, it is –  Panayiotis Jun 5 '11 at 18:48
@Panayiotis - Could you please post the code with the modifications made ? ( pastebin.com ) –  Mahesh Jun 5 '11 at 18:51
show 7 more comments

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?

share|improve this answer
add comment

Your Answer


