malloc h



Автор АФ задал вопрос в разделе Другие языки и технологии

C, malloc realloc и получил лучший ответ

Ответ от Ёыроежка[гуру]
Эти функции возвращают указатель на тип void. Указательна этот тип может быть преобразован в указатель на любой другой тип. Так что в принципе касатинг (int *) не нужен.
Тем не менее это делает более читабельным код, то есть дает представление о типе того объекта, память для которого вы распределяете.
Есть единственная техническая разница, которая использовалась на старых компиляторах. Дело в том, что эти функции объявлены в заголовочном файле <stdlib.h>. Иногда программисты забывают включить этот заголовок в свою программу. Тогда согласно стандарту С действует правило, что если нет прототипа функции, то значит по умолчанию она возвращает значение int.
Программисты пользовались этим и указывали выражение без кастинга
char *p = malloc( N );
Тогда компилятор сразу же выдавал сообщение об ошибке, так как указателю на char присваивалась величина типа int. То есть запись без кастинга позволяла выявить тот случай, когда программист забывал вставить соответствующий заголовочный файл <stdlib.h>
Когда же пишется как
char *p = ( char * ) malloc( N );
то компилятор пропускал этот код, даже если требуемый заголовок опущен, то есть он считал, что вы преобразуете int в (char * ).
Но сейчас без этого технического приема компиляторы сообщают, когда вы используете функцию без прототипа, то есть когда вы зхабыли включить нужный заголовок.
Так что лучше для читабельности программы перед malloc вставить кастинг.
Ведь трудно поянть из выражени
p = malloc( sizeof( *p ) );
для объекта какого типа вы выделяете память.
P.S. Не забудьте мне поставить 10 баллов за лучший ответ!:)

Ответ от 22 ответа[гуру]
Привет! Вот подборка тем с похожими вопросами и ответами на Ваш вопрос: C, malloc realloc
Динамическое распределение памяти на Википедии
Посмотрите статью на википедии про Динамическое распределение памяти
 

Ответить на вопрос:

Имя*

E-mail:*

Текст ответа:*
Проверочный код(введите 22):*