Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Freeing strings in C

Tags:

c

free

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?

like image 841
Andna Avatar asked Apr 08 '12 13:04

Andna


4 Answers

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.

like image 87
Jack Avatar answered Nov 01 '22 14:11

Jack


You've got a memory leak here. When you set a="abc", you're not filling the memory you just allocated, you're reassigning the pointer to point to the static string "abc". b points to the same static string.

What you want instead is strncpy(a, "abc", 4), which will copy the contents of "abc" into the memory you allocated (which a points to).

Then you would need to free it when finished.

like image 31
rampion Avatar answered Nov 01 '22 14:11

rampion


Simple answer yes,no. Also your code is buggy.

Concrete answer:

char *a=malloc(sizeof(char)*4);

You allocate memory so you should free it.

a="abc";

This assigns a pointer to a constant string to your char* a, by doing so you loose the pointer to the memory allocated in the first line, you should never free constant strings.

Use strcpy(a,"abc"); instead of a="abc"; to move the string into your allocated memory.

like image 22
josefx Avatar answered Nov 01 '22 13:11

josefx


You cannot assign string in this way with C

a = "abc"

However if you use malloc then you have to use free, like this

free(a);

But pay attention if you use free(a) in your example you get an error. Because after the malloc you change the pointer a value to the static string "abc"; So the next free(a) try to free a static data. And you get the error.

like image 29
dash1e Avatar answered Nov 01 '22 13:11

dash1e