У меня есть родительская структура, которая содержит дочернюю структуру, а также указатель на объединение, которое указывает на дочерний элемент.Моя проблема в том, что приведенный ниже пример кода работает до тех пор, пока я не хочу указать свой указатель на мою родительскую структуру на другой экземпляр моей родительской структуры, и в этот момент мои внутренние указатели, кажется, сломаются и станут причиной ошибок.Я могу обойти это, обновляя внутренние указатели каждый раз, когда я изменяю, куда указывает родитель, но надеюсь этого избежать.Я думал, что, поскольку внутренне структура не меняется, внутренние указатели все равно будут настроены так, чтобы указывать на правильное смещение от нового родительского адреса, но, похоже, я ошибаюсь?
Может ли кто-нибудь мне помочь, ниже у меня есть пример кода (пожалуйста, не обращайте внимания на бессмысленность моего примера, моя ситуация намного сложнее, и для этого есть причина, но пример иллюстрирует мою проблему).
Вот упрощенная версия моего сценария:
typedef struct mychildstruct
{
uint16_t member
}mychildstruct;
typedef union myunion
{
mychildstruct child;
uint16_t a;
}myunion;
typedef struct myparentstruct
{
mychildstruct child;
myunion *union;
}myparentstruct;
myparentstruct parent;
myparentstruct *parent_ptr;
parent_ptr = (myparentstruct *)&parent;
parent_ptr->union = (myunion *)&parent.child;
Здесь нет проблем, и чтение или запись в parent_ptr->union->child
работает нормально и правильно указывает на то же место в памяти, что и parent_ptr->union->a
.Однако, если я сделаю это:
myparentstruct parent2;
parent_ptr = (myparentstruct *)&parent2;
Тогда parent_ptr->union->child
и parent_ptr->union->a
segfault.
Есть ли способ переназначить правильный адрес памяти на parent_ptr->union
каждый раз, когда я меняю parent_ptr
?
Спасибо за помощь!