在程序结束时释放内存有问题。 这是来自学校的练习,使用ADT实现二叉树以及使用数据类型char进行特定实现。
释放代码:
void free_tree(TreeNode *root){
TreeNode *cur;
if (!root) return;
else{
cur = root;
free_tree(cur->left);
free_tree(cur->right);
free(cur->key); //throws an error!
free(cur);
} }
这是关键本身的i malloc(问题可能在这里):
puts("Please enter a value for key of new node");
_flushall();
scanf("%s",&buffer);
user_input = (char *) malloc(sizeof(char)*(strlen(buffer)+1));
strcpy(user_input,buffer);
user_input[strlen(buffer)+1] = '\0';
p_node = create_tree_node(user_input); //this function append the new data to a new node, returns *TreeNode
insert_node_by_value(&root,p_node,str_comp);
break;
这是我得到的错误:
BTW释放节点本身工作正常!
我感谢您的帮助以及有关代码功能的任何提示和评论。
可以在此处找到functions.c的完整代码粘贴: http://pastebin.com/TqaNK5v8 - 函数
答案 0 :(得分:1)
我能找到的唯一实际问题是:
user_input[strlen(buffer)+1] = '\0';
由于user_input具有'strlen(buffer)+ 1'元素,因此它只能从0转换为strlen(缓冲区)。要解决这个问题非常简单,删除行,strcpy行为就是复制源字符串的\ 0。
答案 1 :(得分:1)
超过100的99个分支是cur->键未分配或 free'd 不止一次。
另外
user_input[strlen(buffer)+1] = '\0';
应该是
user_input[strlen(buffer)] = '\0';
必须在scanf之前分配和缓冲区以保存使用scanf检索的输入数据。
无法更多地了解您粘贴的代码
希望这有帮助
答案 2 :(得分:0)
数组索引从0开始。因此,如果要分配n个字节,访问第n个字节的正确方法是::
SomeArray[n-1] ;
答案 3 :(得分:0)
你将错误的诊断投射到其他人身上。请提供最小的可编译测试用例供我们调试。最小意味着“在没有任何不必要或不相关的代码的情况下显示问题的症状”。可编译意味着“能够在我们的机器上编译而不会修复错误或填补空白”。
在C中,您不需要转换malloc的返回值。停止使用C ++编译器来编译C代码。你知道scanf会失败吗?我怀疑这就是你在scanf之前错误地冲洗的原因。尝试正确处理scanf故障,而不是假设非便携式黑客会为你做这件事。您是否知道strcpy将为您终止目标字符串?
你正在读哪些书?