#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char* f(void) {
char *x;
x = malloc(sizeof(char) * 4);
strcpy(x, "abc");
return(x);
}
int main(void) {
char *a;
a = f();
printf("%s", a);
free(a);
return(0);
}
Does the variable x in the function have to be freed? If so, how is that possible when I need to return it?
Yes (kinda, see my later comment). Every call to
mallocrequires a later call tofree. Otherwise, you have a leak. Remember though; you are not “free[ing]x“, you are freeing the memory that x refers to.When you return
xa copy of the value (an address) ofxis made and returned to the caller.xwas declared with automatic storage duration. It is the memory it refers to that must be freed.Your design has placed the onus on the caller to free the memory. You have already done this in main. Of course, using this method requires that you document the function so that users of your code know that they are receiving an address to memory which was dynamically allocated.
A better approach (IMO) is to take a buffer as an input parameter. Now it is very clear who is responsible for managing this memory (i.e., the caller). Perhaps I don’t even want to dynamically allocate it. With this design it is my choice.
On a side note, you should always be checking the return value of
malloc. It can fail, in which case a null pointer will be returned. Also,sizeof(char)is guaranteed to be1by the standard, so you can remove that bit and just saymalloc(n).