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



不知道我的代码发生了什么。实现了一个简单的二叉搜索树,一切顺利——插入一堆元素没有问题。然后,当我试图添加一些文件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));

是一个很好的例子,为什么它是一个好主意,类型定义指针?建议"不"。

你有两个问题:

  1. 你正在分配一个指向struct node的指针到指向struct node的指针-你不需要在转换中使用*(并且有些人会认为你不需要转换malloc()的结果)。

  2. 你只为指针分配了足够的空间,但你使用它就好像它足够大,可以容纳一个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);

我不能试着确定,因为我没有使用你的库,所以我不能保证它能工作,但我希望它能解决这个问题。

相关内容

  • 没有找到相关文章

最新更新