自引用结构和解除引用

时间:2014-08-15 19:09:20

标签: c pointers struct

如果我有以下代码,我如何访问包含"在这里的字符串" 从根开始? (不只是使用l->data)。

我尝试使用root->left->data但最终出现了seg错误,我尝试使用GDB,但我非常喜欢使用它。

编辑:还有一种更好的方法来初始化指针所指向的结构吗?

struct node
{
  char *data;
  struct node *left;
  struct node *right;
} *root, *l, *r;

root->data = "root here";
root->left = l;
root->right = r;

l->data = "left here";  //the data I need
l->left = NULL;
l->right = NULL;

r->data = "right here";
r->left = NULL;
r->right = NULL;

1 个答案:

答案 0 :(得分:4)

您应该为这三个指针(rootlr)分配内存。现在,它们都是未初始化的,所以垃圾(也可能指向垃圾):

struct node
{
  char *data;
  struct node *left;
  struct node *right;
} *root, *l, *r;

root = malloc(sizeof(struct node));
l    = malloc(sizeof(struct node));
r    = malloc(sizeof(struct node));

root->data = "root here";
root->left = l;
root->right = r;

l->data = "left here";
l->left = NULL;
l->right = NULL;

r->data = "right here";
r->left = NULL;
r->right = NULL;

现在printf("%s", root->left->data);应打印"left here",同样适用于root->left->right"right here"

请注意,在某些时候你必须free这三个指针。

如果您不想使用动态内存管理(malloc / calloc + free),则另一种方法是在堆栈上而不是在堆上分配三个节点。您可以将rootlr声明为struct node而不是struct node*来执行此操作。

struct node
{
  char *data;
  struct node *left;
  struct node *right;
} root, l, r; /* <-- note that they aren't pointers */

void myFunc()
{
    root.data = "root here";
    root.left = &l; /* note the use of & to get the "address of" l */
    root.right = &r; /* same here, but for r */

    l.data = "left here";
    l.left = NULL;
    l.right = NULL;

    r.data = "right here";
    r.left = NULL;
    r.right = NULL;
}