为什么以下C代码被发送SIGSEGV信号?

时间:2013-03-28 11:50:03

标签: c pointers sigsegv

我有以下结构:

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;
}

但是,以下代码会返回120

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函数的堆栈上分配的?如果是这样,你如何建议我修复它,以便它使用mallocated内存?

1 个答案:

答案 0 :(得分:3)

createNode()中,您清楚地存储了局部变量的地址(&node):

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

那不会飞;只要该功能退出存储的地址无效且无法访问。