1

在程序结束时释放内存有问题。这是来自学校的练习,使用 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);
} }

这是我为密钥本身 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;

这是我得到的错误:

错误信息

顺便说一句,释放节点本身工作正常!

感谢您的帮助以及有关代码功能的任何提示和评论。

可以在这里找到functions.c的完整代码粘贴:http: //pastebin.com/TqaNK5v8 - 函数

4

4 回答 4

1

我能找到的唯一实际问题是:

 user_input[strlen(buffer)+1] = '\0';

由于 user_input 有 'strlen(buffer) + 1' 元素,它只能从 0 索引到 strlen(buffer)。解决这个很简单,去掉那行,strcpy的行为就是复制源字符串的\0。

于 2013-01-19T10:00:05.923 回答
1

99 chanches over 100 是 cur->key未分配或多次释放。

user_input[strlen(buffer)+1] = '\0';

应该

user_input[strlen(buffer)] = '\0';

并且缓冲区必须在 scanf 之前分配,以保存使用 scanf 检索的输入数据。

无法告诉更多查看您粘贴的代码

希望这可以帮助

于 2013-01-19T10:00:48.920 回答
0

数组索引从 0 开始。因此,如果要分配 n 个字节,访问第 n 个字节的正确方法是:

SomeArray[n-1] ;
于 2013-01-19T10:14:15.667 回答
0

你把你错误的诊断投射到别人身上。请提供一个最小的可编译测试用例供我们调试。最小意味着“在没有任何不必要或不相关的代码的情况下显示问题的症状”。可编译的意思是“能够在我们的机器上编译而不修复错误或填补空白”。

在 C 中,您不需要强制转换 malloc 的返回值。停止使用 C++ 编译器来编译 C 代码。你知道 scanf 会失败吗?我怀疑这就是为什么您在 scanf 之前错误地冲洗的原因。尝试正确处理 scanf 故障,而不是假设非便携式黑客会为您做这件事。您是否知道 strcpy 将为您终止目标字符串?

你在读哪些书?

于 2013-01-19T11:50:55.347 回答