Вложенная структура с вложенными указателями

Я использую структуру данных для реализации проверки орфографии. У меня было две структуры, узел и таблица, которые определены в следующем:

#include <stdlib.h>
typedef struct node *tree_ptr;
typedef struct table * Table;
struct node
{
    char* element;
    tree_ptr left, right;
};

typedef struct table
{
    tree_ptr head;
    int tree_h;
}table;

int main() {
    Table t = malloc(sizeof(table));
    t->head = NULL;
    tree_ptr ptr = t->head;
    ptr = malloc(sizeof(tree_ptr));
    ptr->element = "one";
    ptr->left = NULL;
    ptr->right = NULL;
    printf("%s\n",t->head->element);
   return 0;
} 

Эта программа содержит ошибку в последней строке функции печати, так как t->head указывает на NULL.

Как я знаю, при изменении значения содержимого указателя переменная, на которую указывает указатель, автоматически изменяется.

Поскольку t->head и ptr оба являются указателями, а ptr указывает на t->head, то есть они указывают на один и тот же объект.

Затем, когда я изменяю значение ptr, почему t->head не меняется таким же образом?? Что я должен сделать, чтобы добиться изменения t->head при изменении ptr??

1 ответ

Решение

Вы должны назначить ptr вернуться к t->head, Помимо этого вы должны выделить sizeof(struct node) для одного узла:

int main() {
    Table t = malloc(sizeof(table));
    t->head = NULL;

    tree_ptr ptr = malloc( sizeof(struct node) );
                              //         ^^^^      
    ptr->element = "one";
    ptr->left = NULL;
    ptr->right = NULL;

    t->head = ptr; // <-------

    printf("%s\n",t->head->element);
   return 0;
} 

Заметка ptr = t->head только назначает значение t->head в ptr, ptr = malloc(....) выделяет динамическую память и назначает адрес памяти ptr и перезаписать значение t->head который был там раньше. Но адрес памяти никогда не присваивается t->head, Там нет волшебной связи между ptr а также t->head,

То, что вы пытались сделать, это что-то вроде этого:

tree_ptr *ptr = &(t->head);
*ptr = malloc( sizeof(struct node) );
(*ptr)->element = "one";
(*ptr)->left = NULL;
(*ptr)->right = NULL

В этом случае ptrэто указатель на t->head а также *ptr = malloc( sizeof(struct node) ) назначает адрес выделенной памяти, где ptr относится и это t->head,

Другие вопросы по тегам