0

私は次の構造を持っています:

typedef struct binTree_t {
  int key;
  enum {lMore, rMore, equal} ratio;
  struct binTree_t* parent;
  struct binTree_t*   left;
  struct binTree_t*  right;
  struct binTree_t**  root;
} binTree_t;

これは AVL ツリーを表します。問題は、ルート ダブル ポインターのようです。アイデアは、このように への変更が*(node->root)同じ を指すすべてのノード全体に伝播するというものnode->rootです。この二重の抽象化により、 が**(node->root)常に正しいルート ノードを指していることを保証する必要があります。ただし、メモリを割り当てる方法に問題があるようです。

binTree_t* createNode(int key, binTree_t* root) {
  binTree_t* node = malloc(sizeof(binTree_t));
  node->key    = key;
  node->ratio  = equal;
  node->parent =
  node->left   =
  node->right  = NULL;
  node->root   = root?&root:&node;
  return node;
}

次のコードはどちらも正しく返され12ます。

int main(void) {
  binTree_t* root = createNode(12, NULL);
  printf("%d", root->key); free(root);
  return EXIT_SUCCESS;
}

int main(void) {
  binTree_t* root = createNode(12, NULL);
  printf("%d", (*(root->root))->key); free(root);
  return EXIT_SUCCESS;
}

ただし、次のコードは と を返し12ます0

int main(void) {
  binTree_t* root = createNode(12, NULL);
  printf("Text");
  printf("%d", root->key); free(root);
  return EXIT_SUCCESS;
}

int main(void) {
  binTree_t* root = createNode(12, NULL);
  printf("Text");
  printf("%d", (*(root->root))->key); free(root);
  return EXIT_SUCCESS;
}

関数root->rootのスタックにポインタが割り当てられたように見えますか?createNodeもしそうなら、どのように修復して、不正に割り当てられたメモリを使用することをお勧めしますか?

4

1 に答える 1

3

では、ローカル変数 ( )createNode()のアドレスを明確に保存しています。&node

node->root   = root?&root:&node;

それは飛びません。その関数が終了するとすぐに、保存されたアドレスは無効になり、アクセスできなくなります。

于 2013-03-28T11:52:04.547 に答える