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

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

#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 ??


person NUO    schedule 13.02.2016    source источник
comment
ptr = malloc(sizeof(tree_ptr)); --›› ptr = malloc(sizeof *ptr); о, радость typedefs... счастливая радость радость радость радость...   -  person wildplasser    schedule 13.02.2016
comment
@wildplasser извините, это все еще не работает.   -  person NUO    schedule 13.02.2016
comment
Тогда, когда я меняю значение ptr, почему t-›head не изменяется таким же образом? -- Потому что ptr указывает на сегмент памяти malloced, а t -> head по-прежнему указывает на NULL.   -  person Spikatrix    schedule 13.02.2016
comment
Как только вы напишете ptr = malloc..., тогда ptr больше не будет t->head. И вы никогда не устанавливаете t->head ни в какое другое значение, кроме NULL, поэтому оно остается NULL.   -  person lurker    schedule 13.02.2016
comment
не typedef указатель!   -  person too honest for this site    schedule 13.02.2016
comment
@Olaf Хотел бы я, чтобы часть кодов, например определение структуры, была дана мне. я ничего не мог с этим поделать.   -  person NUO    schedule 13.02.2016


Ответы (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.

person Rabbid76    schedule 13.02.2016
comment
здесь все немного сложно. Дается весь код определения, я ничего не мог с этим поделать. Я хочу реализовать таблицу, содержащую полное упорядоченное дерево, в котором хранится голова дерева. Если вы реализуете ptr как указатель на t-›head, то что, если я хочу использовать ptr для обхода дерева (например, вставка нового узла, мне нужно пройти по дереву, а также внести новые изменения в дерево) , тройник тоже поменяют, тогда голову потеряю. - person NUO; 13.02.2016
comment
Я знал, почему это не работает, но я не знаю, как это решить. Я поднял дополнительный вопрос в следующем, надеюсь, вы можете мне помочь. Спасибо. stackoverflow.com/questions/35384096/ - person NUO; 13.02.2016