Технически, это зависит от того, что делает my_struct_use
.Однако, если это нормально, и все, что он делает, приведено к правильному типу, как это:
void my_struct_use(struct my_struct *ptr)
{
struct some_struct_came_from_3rdparty_lib *use = (struct some_struct_came_from_3rdparty_lib*)ptr;
// ... use ptr
}
, то не существует неопределенного поведения.Вы никогда не получите доступ к lvalue типа struct some_struct_came_from_3rdparty_lib *
как любой другой тип.Внутри my_struct_use
, ptr
на самом деле имеет тип struct my_struct *
(он был создан броском, который производит новое значение).Тогда вполне нормально привести это (обратно) к struct some_struct_came_from_3rdparty_lib *
, снова производя новое значение этого типа.
Это будет Неопределенным поведением, если вы сделаете это вместо этого:
struct some_struct_came_from_3rdparty_lib * use = *(struct some_struct_came_from_3rdparty_lib**)(&ptr);
Тогда вы получите доступ к ptr
, который является объектом типа struct my_struct*
, через lvalue типа struct some_struct_came_from_3rdparty_lib*
(создается разыменованием результата приведения).