Следует помнить о sizeof
, что это время компиляции оператор 1 ;он возвращает количество байтов на основе типа операнда.
Тип arr
равен int [24]
, поэтому sizeof arr
будет соответствовать количеству байтов, необходимому для хранения 24 int
значений.Тип ptr
равен int *
, поэтому sizeof ptr
будет соответствовать количеству байтов, необходимых для хранения одного значения int *
.Поскольку это происходит во время компиляции, у sizeof
нет способа узнать, на какой блок памяти ptr
указывает или насколько он велик.
Как правило, вы не можете определить, на какой объем памяти указывает указатель, исходя из самого значения указателя;эта информация должна отслеживаться отдельно.
Стилистический нит: предпочтительный способ написать вызов malloc
-
int *ptr = malloc(sizeof *ptr * N);
В C вам не нужно приводить результат malloc
к целевому типу указателя 2 , и это может скрыть полезную диагностику, если вы забудете включить stdlib.h
или иным образом не иметь прототип для malloc
в области видимости.
Во-вторых, обратите внимание, что я передаю выражение *ptr
в качестве операнда sizeof
, а не (int)
.Это минимизирует количество ошибок в случае, если вы измените тип ptr
, но забудете изменить тип в соответствующем вызове malloc
.Это работает, потому что sizeof
не пытается оценить операнд (то есть он не пытается разыменовать ptr
);он вычисляет только свой тип .
1 Исключение из этого правила возникает, когда
sizeof
применяется к массиву переменной длины;поскольку размер массива не определен до времени выполнения, оператор
sizeof
, примененный к VLA, будет оцениваться во время выполнения.
2 Обратите внимание, что это
не случай в C ++;приведение требуется, но если вы пишете на C ++, вы должны все равно использовать
new
и
delete
вместо
malloc
и
free
.Кроме того, это верно только с C89;в старых версиях C
malloc
возвращалось
char *
вместо
void *
, поэтому для этих версий требовалось приведение
.Если вы не работаете над
очень старой реализацией (такой как старый VAX mini, на котором установлена древняя версия VMS), это не должно быть проблемой.