如果我有以下代码,我如何访问包含"在这里的字符串" 从根开始? (不只是使用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;
答案 0 :(得分:4)
您应该为这三个指针(root
,l
和r
)分配内存。现在,它们都是未初始化的,所以垃圾(也可能指向垃圾):
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
),则另一种方法是在堆栈上而不是在堆上分配三个节点。您可以将root
,l
和r
声明为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;
}