我正在尝试通过从文件中读取行来实现二叉搜索树。
while(fgets(p, 1024, fp))
{
struct node child;
child.str = (char *)malloc(plen);
strcpy(child.str,p);
insert(&tree,&child);
}
现在的问题是我似乎无法找到一种方法来制作一个全新的 child 副本,而是在每次 while 循环重新启动时更改它的值。
我正在尝试通过从文件中读取行来实现二叉搜索树。
while(fgets(p, 1024, fp))
{
struct node child;
child.str = (char *)malloc(plen);
strcpy(child.str,p);
insert(&tree,&child);
}
现在的问题是我似乎无法找到一种方法来制作一个全新的 child 副本,而是在每次 while 循环重新启动时更改它的值。
那是因为指向子对象的指针 ( &child
) 没有改变。您可以通过打印出来来说服自己:
printf("address of child = %p\n", &child);
解决方案:您还需要分配节点:
struct node*child = malloc(sizeof(struct node));
然后,您可以按原样分配child.str
,现在使用指针语法:
child->str = (char *)malloc(plen);
strcpy(child->str,p);
...并且因为孩子是一个指针,所以你不需要这里的&符号:
insert(&tree,child);
没有看到很难说insert()
。我的猜测是你的自动struct node
在每次迭代时都超出了范围。指向此类变量的指针不再有效。
如果你以这种方式定义成一个函数
struct node child;
这是一个临时内存,因此在退出该功能后,您可能会丢失数据。所以你必须用malloc
or动态定义结构calloc
struct node *child = malloc(sizeof(struct node));
或者
struct node *child = calloc(1,sizeof(struct node));
calloc 允许分配内存并将其设置为 0