Переназначение пустых указателей в C - PullRequest
0 голосов
/ 26 апреля 2019

Я делаю Бинарное дерево - это C. Я знаю, как создавать Бинарные деревья, здесь не проблема.

Я использовал указатели void для root и все элементы, которые будут добавлены в дерево.

Когда двоичное дерево пусто (корень указывает на NULL), я просто делал корневую точку к элементу, который станет первым элементом дерева. Но root не получил адрес элемента, на который он должен указывать. Это было просто повторное назначение.

Как я упоминал выше, я пытался просто переназначить указатели void, чтобы назначить новый адрес для корня.

Но когда я назначал отдельные значения элемента для корня, все, казалось, работало идеально.

Представляет все элементы для двоичного дерева.

struct node {

  void * key;
  void * value;
  struct node * left;
  struct node * right;

};

Первый подход: простое переназначение, которое не удается

void map_tree_put(struct node * root, struct node * ele){

    if(root==NULL) {
      root = ele;
    }
    else {
      /* some other code*/
    }

}

Второй подход: индивидуальное присвоение значения работает отлично

void map_tree_put(struct node * root, struct node * ele){

    if(root==NULL) {
      root->key = ele.key;
      root->value = ele.value;
      root->left = NULL;
      root->right = NULL;
    }
    else {
      /* some other code*/
    }

}

Тестовый код

int main() {

  struct node * r = NULL;

  int key = 10;
  int value = 100;
  struct node ele = {&key, &value, NULL, NULL};

  map_tree_put(r, &ele);

  printf("%d\n", *(int*)r->key); /* I get segmentation fault over here with the first approach but work fine with the second approach */


  return 0;

}

Ответы [ 2 ]

1 голос
/ 26 апреля 2019

Это потому, что в этом коде:

void map_tree_put(struct node * root, struct node * ele){

    if(root==NULL) {
      root = ele;
    }
    else {
      /* some other code*/
    }
}

функция получает копию указателей.Чтобы указатель root запомнил переназначение при возврате функции, вам нужно сделать это следующим образом:

void map_tree_put(struct node **root, struct node *ele){
  if (root) {
    if(*root==NULL) {
      *root = ele;
    }
    else {
      /* some other code*/
    }
  }
}
1 голос
/ 26 апреля 2019

Попробуйте

void map_tree_put(struct node ** root, struct node * ele){
if((*root)==NULL) {
      (*root) = ele;
    }
    else {
      /* some other code*/
    }

}

, и вызов из main должен быть map_tree_put(&r, &ele);

Это касается передачи по значению и ссылке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...