I have encounterd some code which typecase an uint32 number to struct pointer
Адрес первого члена struct
и самого struct
являются взаимозаменяемыми:
void foo(uint32 *u)
{
((StructA *)u)->a = 10;
}
StructA t;
foo((uint32 *)&t);
Но это не означает, что вы можете использовать конкретный тип для инициализацииstruct
, в вашем случае:
a = (StructA*)b;
вы используете целое число для инициализации указателя, в результате a
указывает на мусор (некоторый случайный адрес).
Существуетв этом нет проблем:
a = (StructA*)&b; // notice the address-of operator
, поскольку a
и b
имеют одинаковые требования к выравниванию и являются взаимозаменяемыми, но попытка доступа к a->someOtherElement
является неопределенным поведением.