Вложенная структура с вложенными указателями
Я использую структуру данных для реализации проверки орфографии. У меня было две структуры, узел и таблица, которые определены в следующем:
#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
,