不知道我的代码发生了什么。实现了一个简单的二叉搜索树,一切顺利——插入一堆元素没有问题。然后,当我试图添加一些文件IO功能时,我的程序突然崩溃了。我想也许我在文件指针和写入方面搞砸了一些东西(尽管这也没有真正意义,因为它使其余的代码保持原样),所以我拿出了代码的存档版本,并且BAM -在2次输入后崩溃,即使它在我最后一次尝试时完全工作!
添加一堆调试打印语句(抱歉仍然需要学习使用调试器),似乎崩溃最常发生在我的malloc -但有时它随机崩溃在不同的点,如果我继续重新运行程序。
我真的被这个弄糊涂了。为什么我能够插入~10个元素,现在我甚至不能插入3个?任务管理器说我有大约4Gb的空闲内存,这并不是说我在做大量的输入——这应该不会消耗内存。另外,它是如何崩溃在不同的地方,即使我运行完全相同的代码?
我将非常感谢任何见解。运行Windows 10, Codeblocks作为IDE。main函数和下面讨论的函数的代码。在我的大多数运行中,程序在第三次插入到达"已分配空间"之前崩溃,但有时它设法插入它-然后程序无论如何崩溃,没有明显的原因。
#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("nnInside 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;
}
}
一行:
temp = (BSTREE*)malloc(sizeof(BSTREE));
是一个很好的例子,为什么它是一个好主意,类型定义指针?建议"不"。
你有两个问题:
你正在分配一个指向
struct node
的指针到指向struct node
的指针-你不需要在转换中使用*
(并且有些人会认为你不需要转换malloc()
的结果)。你只为指针分配了足够的空间,但你使用它就好像它足够大,可以容纳一个
struct node
;它不是。
基本的修复是这样的行之一:
temp = (BSTREE)malloc(sizeof(struct node));
temp = malloc(sizeof(*temp));
在我能想到的第一个sizeof
运算符中没有办法使用BSTREE
。第二种其实是一种合理的技巧;即使temp
的类型改变,它仍然有效。您也可以创建各种混合。
我建议使用:
typedef struct BSTree BSTree;
struct BSTree
{
int data;
BSTree *left;
BSTree *right;
};
然后写
BSTree *temp;
temp = (BSTree *)malloc(sizeof(BSTree));
temp = malloc(sizeof(*temp));
您可能注意到第二个选项没有改变。
似乎您没有返回您使用malloc
保留的内存。当使用动态内存时,再次释放它是很重要的,否则你会有所谓的内存泄漏,并且内存大小只会增加,直到程序崩溃。
释放(释放)内存的函数是free();
调用应该看起来像free(temp);
我不能试着确定,因为我没有使用你的库,所以我不能保证它能工作,但我希望它能解决这个问题。