不确定我的代码是怎么回事。正在实现一个简单的二叉搜索树,并使一切工作 - 插入一堆元素没有问题。然后,在尝试添加一些文件IO功能时,突然间我的程序崩溃了。我想也许我已经把文件指针和写入搞砸了(虽然这也没有意义,因为它保留了其余代码不变),所以我提取了一个存档版本的代码,并且BAM - 在2次输入后崩溃,即使它在我最后一次尝试时完全正常工作!
添加一堆调试打印语句(抱歉仍然需要学习使用调试器),似乎崩溃最常发生在我的malloc上 - 但是如果我继续重新运行该程序,它有时会在不同点随机崩溃。 / p>
我真的很困惑。我怎么能插入~10个元素,现在我甚至不能插入3个?任务经理说我有~4Gb的RAM免费,并不像我正在做大量的输入 - 这应该花费内存绝对没有。即使我运行完全相同的代码,它又是如何在不同的地方崩溃的?
我非常感谢任何见解。运行Windows 10,Codeblocks作为IDE。主要代码和下面讨论的功能。在我的大多数运行中,程序在第三个插入到达“Space Allocated”之前崩溃,但有时它设法插入它 - 然后程序崩溃无论如何,没有明显的原因。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef struct node *BSTREE;
struct node
{
int data;
BSTREE left;
BSTREE right;
};
BSTREE insert(BSTREE root, int number);
BSTREE find(BSTREE root, int number);
void inOrderTraversal(BSTREE subtree);
int main(){
BSTREE root = NULL;
root = (insert(root, 2));
insert(root, 4);
insert(root, 1);
}
BSTREE insert(BSTREE root, int number)
{
printf("\n\nInside insert");
BSTREE temp = NULL;
if(!(root)){
printf("\nInside empty root");
temp = (BSTREE*)malloc(sizeof(BSTREE));
printf("\nSpace allocated");
temp->left = NULL;
temp->right = NULL;
printf("\nleft and right set to null");
temp->data = number;
printf("\n data set to number");
root = temp;
printf("\nroot is now temp; Before returning root");
printf("\n node data: %d %d %d", root->data, root->left, root->right);
return root;
}
if(number < root->data){
root->left = (insert(root->left, number));
}
else if(number > root->data){
root->right = (insert(root->right, number));
}
else if(number == root->data){
return root;
}
}
答案 0 :(得分:1)
该行:
temp = (BSTREE*)malloc(sizeof(BSTREE));
是Is it a good idea to typedef pointers?推荐&#39;否&#39;。
的一个很好的例子你有两个问题:
您正在为指向struct node
的指针分配指针指向struct node
的指针 - 您不需要*
中的struct node
演员(并且有些人会争辩you don't need to cast the result of malloc()
)。
您只为指针分配足够的空间,但您正在使用它,好像它足够大以容纳temp = (BSTREE)malloc(sizeof(struct node));
temp = malloc(sizeof(*temp));
;它不是。
基本修正是以下其中一行:
BSTREE
在我能想到的第一个sizeof
运算符中,没有一种方法可以使用temp
。第二个实际上是一种声音技术;即使typedef struct BSTree BSTree;
struct BSTree
{
int data;
BSTree *left;
BSTree *right;
};
的类型发生变化,它仍然有效。你也可以制作各种混合动力车。
我建议使用:
BSTree *temp;
temp = (BSTree *)malloc(sizeof(BSTree));
temp = malloc(sizeof(*temp));
然后你写了:
Func<T>
你可能会注意到第二种选择没有改变。
答案 1 :(得分:0)
您似乎没有返回使用malloc
保留的内存。使用动态内存时,重新发布它很重要,否则你会有一个所谓的内存泄漏,只是程序崩溃才会增加大小。
释放(释放)记忆的功能是free();
来电应该看起来像free(temp);
我无法尝试确保,因为我没有使用您的库,所以我不能保证它有效,但我希望它能解决它。