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!
yes, you need to free the memory returned by malloc.
no, you must not free such an array. There's a reason non-static local variables are said to have automatic storage duration… Also, forget about "the stack" and "the heap". The C standard only specifies abstract semantics for automatic, static and dynamic storage duration.
The string is a collection of characters, an array of a string is an array of arrays of characters. Each string is terminated with a null character. An array of a string is one of the most common applications of two-dimensional arrays.
free() doesn't return anything. It doesn't need to. Show activity on this post. malloc returns a pointer ( void* ) to the allocated memory.
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.
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");
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With