Does the following code free the memory that was allocated for x?
int main()
{
char *x = (char*)calloc(100, sizeof(char));
char *y = x;
free(y);
}
Does the following code free the memory that was allocated for x?
int main()
{
char *x = (char*)calloc(100, sizeof(char));
char *y = x;
free(y);
}
Yes
When you do
char *y = x;
you make y point to the location where x points to. Since y points to a memory location returned by calloc,
free(y);
is perfectly valid. As @haccks commented, this would not work if you make y point to another memory location, provided that this memory location wasn't returned by malloc/calloc/realloc.
In C, you should not cast the result of malloc/calloc/realloc. Also, checking the return value of calloc to see if it was successful is good. calloc will return NULL on failure.
The original version of the question had
int *y = x;
free(y);
I.e. assigning the char pointer to an int pointer and then invoke free() on the int pointer. The signature of free() is void free(void *ptr); so irrespective of char * vs. int *, memory would be released.
The edited (and current) version of the question has
char *y = x;
free(y);
Here, both y and x points to the same memory. This is known as pointer aliasing. Upon the call to free(), that memory would certainly be released.
A problem, however, is that after free(y), the pointer x would be dangling, i.e. the memory it is pointing to is no longer valid.
Note, it is neither necessary nor recommended to cast the return value from calloc.
Yes, it does.
The method is void free(void *ptr), then when you make char* y = x, you have a pointer to the same space memory that y was pointing.
That let you free that space later with free (y).
However, you would put x = NULL because now x doesn't have a own space despite it have a value.
For further information about free read here.
The memory returned by your call of calloc() is released by the call of free().
In your code that affects both x and y.