0

これを実行してツリーを初期化しようとしています:

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

しかし、セグメンテーション違反が発生しています。なぜそれが起こっているのですか?関数へのポインタを渡し、その中にメモリを確保しています。それは間違っていますか?

4

1 に答える 1

2

ポインター 'my_tree' は値で渡されます (これは C で行われる唯一の方法です)

したがって、my_tree は基本的に COPIED であり、「root」の割り当ては「my_tree」変数に影響しません。

ポインターを取得したいので、ポインターをポインター (**) に渡し、*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);
}
于 2013-02-23T15:56:12.407 に答える