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
является свойством указателя, а не того, на что указывает. Это важное различие.