Reputation: 67
This may be a newbie fault, but I am greatful for any tips on what exactly I do wrong.
The code:
int main()
{
int i =0;
char ** nameslist;
nameslist = malloc(5 * sizeof(char*));
for (i=0; i <5; i++)
{
nameslist[i]=malloc((20+1)*sizeof(char));
}
nameslist[0]="John";
nameslist[1]="Adam";
nameslist[2]="Nick";
nameslist[3]="Joe";
nameslist[4]="Peter";
for (i=0; i <5; i++)
{
free(nameslist[i]);
}
free(nameslist);
return 0;
}
Using Valgrind, I still see that I have memory leaks in heap - how do I fix this issue? I suspect that I malloc too much space - but still, how do I go about freeing space I don't necesarrily use?
Thankful for any hints!
Upvotes: 5
Views: 5322
Reputation: 1513
The problem is that when you write this:
nameslist[0]="John";
You're not actually using the memory you have allocated. "John" is itself a pointer and you're overwriting the adress returned by malloc with this new pointer.
Use the strncpy()
function to copy the string into the memory you allocated.
Upvotes: 7
Reputation: 212979
Your malloc
and free
stuff is fine, but you are orphaning the original string when you try to do assignment like this:
nameslist[0]="John";
Instead you should use strcpy
:
strcpy(nameslist[0], "John");
Upvotes: 6