cxphong
cxphong

Reputation: 857

Free an assigned pointer

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);
}

Upvotes: 14

Views: 3542

Answers (4)

Spikatrix
Spikatrix

Reputation: 20244

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.

Upvotes: 19

Arun
Arun

Reputation: 20383

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.

Upvotes: 5

Shondeslitch
Shondeslitch

Reputation: 1079

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.

Upvotes: 1

Peter
Peter

Reputation: 36597

The memory returned by your call of calloc() is released by the call of free().

In your code that affects both x and y.

Upvotes: 0

Related Questions