@ Комментарий РемиЛебо был замечен и указал на точную проблему.Итак, вот решение.
Фон проблемы
Итак, у меня был указатель на объект типа Node aNode
и функция insert(Node *node, int x)
.Я хотел, чтобы функция insert проверила, не указывает ли данный указатель на узел что-либо, затем создала новый узел и установила ссылку в предоставленном узле.Ожидалось, что после установки ссылки aNode
также будет указывать на вновь созданный узел.Однако это было ложное ожидание, потому что я передавал указатель по значению вместо ссылки, что означало, что node
в функции insert
отличался от aNode
Buggy Solution
Таким образом, решением было передать ссылку aNode
в функцию insert
.Поэтому я изменил свой вызов функции на insert
, на это
insert(&aNode, 8);
И изменил определение функции insert
на это
void insert(Node **node, int x)
Это решило проблему, так как **node
теперь был разыменован по адресу aNode
, и я смог получить его значение, просто разыменовав node
на *node
.Проблема возникла, когда я попытался получить доступ к членам Node
по *node->data
.Причина в том, что *
и ->
на самом деле являются операторами, а ->
имеет более высокий приоритет, чем *
.Таким образом, при оценке *node->data
он фактически выполнялся таким образом *(node->data)
, что означает, что компилятор фактически пытался разыменовать node->data
вместо node
.Быстрое решение состояло в том, чтобы просто получить доступ к таким данным (* узел) -> данные.
Правильное решение
Хотя с помощью скобок я смог добиться желаемого поведения, но синтаксис был уродливым.Правильное решение, как @ pm100, указывало на использование ссылки в определении функции вместо разыменования ее дважды, что означает объявление функции следующим образом
void insert(Node *&node, int x)
вместо этого
void insert(Node **node, int x)
Это позволило получить доступчлены узла просто как node->data
вместо (*node)->data
Если вы новичок в указателях, как я, то посмотрите https://www.youtube.com/watch?v=Rxvv9krECNw