标准C - 在malloc崩溃(尽管工作约10分钟前)

时间:2016-11-03 03:13:32

标签: c crash malloc

不确定我的代码是怎么回事。正在实现一个简单的二叉搜索树,并使一切工作 - 插入一堆元素没有问题。然后,在尝试添加一些文件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;
    }
}

2 个答案:

答案 0 :(得分:1)

该行:

 temp = (BSTREE*)malloc(sizeof(BSTREE));

Is it a good idea to typedef pointers?推荐&#39;否&#39;。

的一个很好的例子

你有两个问题:

  1. 您正在为指向struct node的指针分配指针指向struct node的指针 - 您不需要*中的struct node演员(并且有些人会争辩you don't need to cast the result of malloc())。

  2. 您只为指针分配足够的空间,但您正在使用它,好像它足够大以容纳temp = (BSTREE)malloc(sizeof(struct node)); temp = malloc(sizeof(*temp)); ;它不是。

  3. 基本修正是以下其中一行:

    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);

我无法尝试确保,因为我没有使用您的库,所以我不能保证它有效,但我希望它能解决它。