Question

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!

Was it helpful?

Solution

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.

OTHER TIPS

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");
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top