Free() с аргументами в C

Я работаю над преобразованием многих программ на C из Unix в Linux, и этот синтаксис free() привлек мое внимание:

free((char *) area );

Какая разница между этим и free( area );?

Ответы

Ответ 1

Подпись free:

void free(void *ptr);

Итак, если area - тип указателя, возвращаемый malloc или его кузенами, преобразование в free((char *) area ); бессмысленно.

Если... если код действительно, действительно старый, то есть до ANSI C введен void * в качестве общего указателя. В это древнее время char * используется как общий указатель.

Ответ 2

Если кто-то сохранил указатель на динамически распределенные данные в типе не указателя, санкционированного стандартом, то есть area объявлен как intptr_t, это отличает не указатель на тип указателя и позволяет его освобождать.

Если area уже является типом указателя, это не имеет никакого смысла с любым кодом C, написанным в последней четверти века.

Ответ 3

Подпись free() в стандарте неверна. Это должно было быть void free(const void *); действительно правильным. Это приводит к тому, что вам нужно повысить значение const *, если вы хотите освободить его без предупреждения.

Существует Линус Торвальд прокомментирует, почему free() должен взять const *.

EDIT: Основная идея, почему проблема спорна, исходит из того, что в целом люди считают, что const имеет какое-либо отношение к памяти, на которую указывает указатель, то есть указатель указывает на постоянную память. Это явно ложно. Квалификация const является свойством указателя, а не того, на что указывает. Это важное различие.