Segfault дочернего указателя при изменении родительского указателя - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть родительская структура, которая содержит дочернюю структуру, а также указатель на объединение, которое указывает на дочерний элемент.Моя проблема в том, что приведенный ниже пример кода работает до тех пор, пока я не хочу указать свой указатель на мою родительскую структуру на другой экземпляр моей родительской структуры, и в этот момент мои внутренние указатели, кажется, сломаются и станут причиной ошибок.Я могу обойти это, обновляя внутренние указатели каждый раз, когда я изменяю, куда указывает родитель, но надеюсь этого избежать.Я думал, что, поскольку внутренне структура не меняется, внутренние указатели все равно будут настроены так, чтобы указывать на правильное смещение от нового родительского адреса, но, похоже, я ошибаюсь?

Может ли кто-нибудь мне помочь, ниже у меня есть пример кода (пожалуйста, не обращайте внимания на бессмысленность моего примера, моя ситуация намного сложнее, и для этого есть причина, но пример иллюстрирует мою проблему).

Вот упрощенная версия моего сценария:

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?

Спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 15 декабря 2018

Ответ на ваш вопрос таков: НЕТ! В вашем примере нет возможности переназначения.

Не имеет значения, используете ли вы абсолютный или относительный указатель.Арифметика указателей вам не поможет.

В вашем примере вы выделяете (статически, в стеке) 2 отдельные структуры:
parent и parent2.

Каждая из нихзанимает отдельные области памяти, и в каждой есть собственный указатель union.Полностью отдельный указатель union!

В своем коде вы инициализируете указатель union, принадлежащий parent.Но затем вы пытаетесь получить доступ к union указателю, принадлежащему parent2.Который вы не инициализировали, и поэтому вы получаете ошибку сегментации.

Позволяет еще больше упростить ваше примерное событие:

myparentstruct parent;
myparentstruct parent2;

parent.union = &parent.child;
parent2.union->a;

Это все равно получит ошибку сегмента.И этот код полностью эквивалентен тому, что вы пытаетесь.

Ничто из того, что вы делаете с указателями, не будет автоматически инициализировать две отдельные переменные одновременно ...

0 голосов
/ 15 декабря 2018

Вы объявили parent2, но не инициализировали его.Кроме того, просматривая предоставленный вами пример кода, вы не выделили место для чего-либо с malloc().Не видя ваш настоящий код, я не могу сказать вам, где вы идете не так.Возможно, вы выделяете пространство или инициализировали parent2, но оно не отображается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...