Когда вы объявляете переменную данного типа, она ссылается на базовый объект этого типа, поэтому эффективным типом объекта является тип связанной переменной.
Когда все становится немного неясным, когда malloc
вступает в игру. Память, возвращаемая из malloc
, не имеет действующего типа. Например:
int *x = malloc(sizeof(int));
Предполагая, что int
имеет размер 4 байта, x
теперь указывает на 4 байта памяти без действующего типа. Эта память получает эффективный тип при назначении:
*x = 123;
Теперь эти байты имеют эффективный тип int
.
В нашем примере вы выделяете 1000 байтов, и изначально эти байты не имеют действующего типа.
*x = 10;
Это делает первые sizeof(int)
байтов объектом типа int
.
struct point *p = x;
Этот должен иметь приведение, но в конце все нормально, потому что первый член struct point
имеет тип int
, а указатель на структуру указывает на его первый член.
p->x = 5;
Это безопасно, потому что &p->x
указывает на объект типа int
, который соответствует типу lvalue p->x
.
p->y = 10;
Это также безопасно, поскольку байты, на которые указывает &p->y
, еще не имеют действующего типа, и присваивание приводит к тому, что следующие sizeof(int)
байты будут объектами типа int
.