初始化指针(malloc)在不同函数中的分段错误

时间:2013-02-23 15:51:49

标签: c tree malloc

我试图通过这样做来初始化树:

typedef struct {
    char *value;
    struct children_list *children;
} tree;

typedef struct t_children_list {
    tree *child;
    struct t_children_list *next;
} children_list;

void initializeTree(tree *root, char *input)
{
  if((root = malloc(sizeof(tree))) == NULL) { abort(); }
  root->value = input;
}

void main()
{
  // Create the tree
  char *input = "aaaaaa";
  tree *my_tree = NULL;

  initializeTree(my_tree, input);
}

但是我遇到了分段错误。为什么会这样?我传递一个指向函数的指针,我在其中保留内存。这是错的吗?

1 个答案:

答案 0 :(得分:2)

指针'my_tree'按值传递(这是在C中完成的唯一方式)

所以my_tree基本上是COPIED,并且“root”的赋值对'my_tree'变量没有任何影响。

你想得到一个指针,所以传递一个指向指针(**)然后init * root来实际修改我的树

void initializeTree(tree **pRoot, char *input)
{
  if((*pRoot = malloc(sizeof(tree))) == NULL) { abort(); }
  *pRroot->value = input;
}

void main()
{
  // Create the tree
  char *input = "aaaaaa";
  tree *my_tree = NULL;

  initializeTree(&my_tree, input);
}

或者根本不传递它,但返回它:

tree *initializeTree(char *input)
{
  tree *root = NULL;
  if((root = malloc(sizeof(tree))) == NULL) { abort(); }
  root->value = input;
  return root;
}

void main()
{
  // Create the tree
  char *input = "aaaaaa";
  tree *my_tree = initializeTree(input);
}