我试图通过从文件中读取行来实现二叉搜索树。
while(fgets(p, 1024, fp))
{
struct node child;
child.str = (char *)malloc(plen);
strcpy(child.str,p);
insert(&tree,&child);
}
现在的问题是,我似乎无法找到一种方法来创建一个完整的子副本,而只是每次while循环重新启动时它都会更改其值。
答案 0 :(得分:3)
那是因为指向孩子的指针(&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);
答案 1 :(得分:3)
很难说没有看到insert()
。我的猜测是你的自动struct node
在每次迭代时超出了范围。指向此类变量的指针不再有效。
答案 2 :(得分:1)
如果以这种方式定义函数
struct node child;
这是一个临时记忆,因此在退出该功能后,存在丢失数据的风险。所以你必须用malloc
或calloc
struct node *child = malloc(sizeof(struct node));
或
struct node *child = calloc(1,sizeof(struct node));
calloc允许分配内存并将其设置为0