malloc()
возвращает указатель на блок памяти (void *
), достаточно большой, чтобы вместить size
(первый аргумент) байтов независимо от того, что это за аргумент или какой результат преобразуется.
Например, stu->roll_no
будет обращаться к первым четырем байтам (при условии, что int
является 32-битным) выделенной памяти (при условии, что структура не заполнена).
В C, void *
указатели неявно преобразуются в тип указателя, которому они назначены.
Ваше понимание верно, за исключением следующего утверждения:
И для ясности, в отличие от обычной структурной переменной, котораявыделит 12 байтов для структурного студента, тогда как переменная указателя структуры выделяет всего 4 байта.
В этом случае указатель на структуру размещается в стеке, а сама структура выделяется в куче.Если бы вы использовали структуру напрямую, она бы выделяла 12 байтов в стеке, а в куче - нет байтов.
Вы правы в этом:
это не похоже на stu->roll_no
эквивалентно *(stu+0)
и stu->mark
эквивалентно *(stu+1)
stu->roll_no
эквивалентно *((int *)stu+0)
и stu->mark
эквивалентно *((int *)stu+1)
.Обратите внимание на приведение к int *
.