Доступ к структурам внутри структур в C - PullRequest
0 голосов
/ 19 ноября 2011

Просто очень короткий вопрос, который возник из другого поста, если бы мне нужно было получить доступ к своему номеру char * в моем ListNode, из моего TreeNode, чтобы каждый TreeNode имел свой собственный связанный список чисел, я бы получил к нему доступ как следует (где TreeNode * root):

root->name = strdup(name); root->numbers->number = strdup(number);

Ура! * * 1004

typedef struct ListNode {
  char            *number;
  struct ListNode *next;
}ListNode;

typedef struct TreeNode {
  char            *name;
  ListNode        *numbers;
  struct TreeNode *left;
  struct TreeNode *right;
}TreeNode;

РЕДАКТИРОВАТЬ: Вот моя функция, чтобы добавить TreeNode и список к этому узлу:

int main(void) {
char my_string[50], name[25], number[25];
TreeNode *root = NULL;
ListNode *list = NULL;
while ((fgets(my_string, 50, stdin)) != NULL) {
    if (my_string[0] == '.')
        break;      
sscanf(my_string, "%s %s", name, number); 
root = AddNode(root, list, name, number);
}   
return 0;
}

TreeNode* AddNode(TreeNode *root, ListNode *list, char *name, char *number) {
int comparison;
if ( root == NULL) {
    root = (TreeNode *)malloc(sizeof(TreeNode));
    list = (ListNode *)malloc(sizeof(ListNode));
    root->name = strdup(name); root->numbers->number = strdup(number);
    root->left = root->right = NULL;

Ответы [ 3 ]

1 голос
/ 19 ноября 2011

Проблема в том, что вы передаете указатель на ListNode, но затем неправильно набираете ListNode, присваиваете ему и ничего не делаете с ним. Я не уверен, каково ваше намерение:

list = (ListNode *)malloc(sizeof(ListNode));

Причиной segfault является то, что вы выделяете TreeNode, но не ListNode внутри него. Вам необходимо сделать:

root = (TreeNode *)malloc(sizeof(TreeNode));
root->numbers = (ListNode *)malloc(sizeof(ListNode));

Или, если вы именно это и хотели сделать с ListNode, который вы используете malloc, вам нужно присвоить его:

root = (TreeNode *)malloc(sizeof(TreeNode));
list = (ListNode *)malloc(sizeof(ListNode));
root->numbers = list;
0 голосов
/ 19 ноября 2011

Я думаю, что root->numbers->number вызывает нарушение сегмента, вы, кажется, не устанавливаете root->numbers, чтобы указывать на что-либо, прежде чем прекратить ссылаться на него.

0 голосов
/ 19 ноября 2011

Если вы не забываете malloc () этот ListNode там, это путь!

...