Freeing strings in C

Andna picture Andna · Apr 8, 2012 · Viewed 26.9k times · Source

If I would write:

char *a=malloc(sizeof(char)*4);
a="abc";
char *b="abc";

do I need to free this memory, or is it done by my system?

Answer

Jack picture Jack · Apr 8, 2012

In your situation you won't have any way to free the dynamic allocated memory because you are losing the reference to it.

Try this out:

#include <stdio.h>
#include <stdlib.h>

int main()
{
  char *a=(char*)malloc(sizeof(char)*4);
  printf("Before: %p\n",a);
  a = "abc";
  printf("After: %p\n",a);
  free(a);
  char *b = "abc";

  return 0;
}

You will obtain

Before: 0x100100080
After: 0x100000f50

You will see that the two pointers are different. This because the string literal "abc" is placed into data sector of the binary files and when you do

a = "abc"

you are changing the pointer of a to point to the constant literal string "abc" and you are losing the previously allocated memory. Calling free on a is not correct anymore, just because it won't point to a valid dynamically allocated address anymore. To preserve the pointer and be able to free it you should copy the string with

strncpy(a, "abc", 4)

This will effectively copy characters from the literal to the dynamically allocated method, preserving the original pointer.