Первая строка объявляет указатель на целое число, но не инициализирует его - поэтому он указывает на какой-то случайный фрагмент памяти, возможно, недействительный.Размер ptr
- это любой размер указателя на int
, вероятно, 4 или 8 байтов.Размер, на который он указывает, который вы получите, разыменовав его, когда он указывает где-то действительный, равен размеру, который имеет int
.
Вторая строка выделяет достаточно памяти для 10 int
скуча, затем присваивает ее ptr
.Приведение не используется, но void *
, возвращаемое malloc()
, автоматически преобразуется в любой тип указателя, который требуется при назначении.sizeof (*ptr)
дает размер разыменованного ptr
, то есть размер того, на что указывает ptr
(int
).Для sizeof
не имеет значения, действительно ли ptr
указывает на допустимую память, просто то, каким будет тип.
Третья строка похожа на вторую, но с двумя изменениями: она явнопреобразует void *
возврат из malloc()
в int *
, чтобы соответствовать типу ptr
;и он использует sizeof
с именем типа int
, а не с выражением этого типа, например *ptr
.Явное приведение не является обязательным, и некоторые люди категорически против его использования, но в итоге все сводится к предпочтениям.
После того, как любой из malloc()
s ptr
должен указывать на допустимое место в куче, его можно безопасно разыменовать, если malloc
был успешным.