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?
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.
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.
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.
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.
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