In C, why do some people cast the pointer before freeing it? In C, why do some people cast the pointer before freeing it? c c

In C, why do some people cast the pointer before freeing it?


Casting may be required to resolve compiler warnings if the pointers are const. Here is an example of code that causes a warning without casting the argument of free:

const float* velocity = malloc(2*sizeof(float));free(velocity);

And the compiler (gcc 4.8.3) says:

main.c: In function ‘main’:main.c:9:5: warning: passing argument 1 of ‘free’ discards ‘const’ qualifier from pointer target type [enabled by default]     free(velocity);     ^In file included from main.c:2:0:/usr/include/stdlib.h:482:13: note: expected ‘void *’ but argument is of type ‘const float *’ extern void free (void *__ptr) __THROW;

If you use free((float*) velocity); the compiler stops complaining.


Pre-standard C had no void* but only char*, so you had to cast all parameters passed. If you come across ancient C code, you might therefore find such casts.

Similar question with references.

When the first C standard was released, the prototypes for malloc and free changed from having char* to the void* that they still have today.

And of course in standard C, such casts are superfluous and just harm readability.


Here's an example where free would fail without a cast:

volatile int* p = (volatile int*)malloc(5 * sizeof(int));free(p);        // fail: warning C4090: 'function' : different 'volatile' qualifiersfree((int*)p);  // success :)free((void*)p); // success :)

In C you can get a warning (got one in VS2012). In C++ you'll get an error.

Rare cases aside, the casting just bloats the code...

Edit:I casted to void* not int* to demo the failure. It will work the same as int* will be converted to void* implicitly. Added int* code.