二进制搜索树malloc没有为后续节点提供足够的内存

时间:2012-11-27 07:30:38

标签: c memory malloc binary-search-tree

我遇到了一个问题,即在我执行第一个节点后,我没有为节点提供足够的内存,例如firstNode = (node)malloc(sizeof(node))。 以下是* node的结构和使用malloc函数的insert函数。

typedef struct treeNode *node;

struct treeNode {
    node left;
    node right;
    int data;
};

node firstN;
node secondN;

node insert(int a, node t){
    if(t==NULL){
        t = (node)malloc(sizeof(node));
        t->data = a;
        t->left = NULL;
        t->right = NULL;
    } else {
        if(a < t->data){
            t->left = insert(a, t->left);
        }else if(a > t->data){
            t->right = insert(a, t->right);
        }
    }
    return t;
}

这是main(),我用malloc测试了插入过程(我没有使用上面定义的插入函数,因为我仍在主要逐行测试。)

firstN=(node)malloc(sizeof(node)*10);
firstN->data=1;
firstN->right=NULL;
firstN->left=NULL;
firstN->right=(node)malloc(sizeof(node)*10);

对我来说有趣的是,虽然上述工作,但通常做(节点)malloc(sizeof(节点))(没有乘以10)不适用于第二个实例,firstN-&gt; right。

我想知道为什么代码没有提供足够的内存,如果这是正确的情况。

2 个答案:

答案 0 :(得分:9)

此:

t = (node)malloc(sizeof(node));

是错误的,你没有分配足够的内存来保存结构,只是指向它的指针,因为node是“指向struct treeNode”的别名。

你需要:

t = malloc(sizeof *t);

请注意这是多么简单? The cast is a bad idea,所以应将其删除。并且大小是错误的,所以让我们让编译器计算它。

对于将结果存储在某个指针p中的许多(多个)分配,sizeof *p的值是malloc()的正确参数。如果您当然正在分配数组,那么这不成立,那么对于某些表达式n * sizeof *p,它通常是n

另外,使用typedef来隐藏指针在C中通常是一个坏主意,因为指针很重要并且它很快就会变得混乱。

答案 1 :(得分:0)

typedef struct treeNode {
    struct treeNode *left;
    struct treeNode *right;
    int data;
}node;

node *firstN;
node *secondN;

node *insert(int a, node *t){
    if(t==NULL){
        t = malloc(sizeof(node));
        t->data = a;
        t->left = NULL;
        t->right = NULL;
    } else {
        if(a < t->data){
            t->left = insert(a, t->left);
        }else if(a > t->data){
            t->right = insert(a, t->right);
        }
    }
    return t;
}

int main(void) {

    firstN = malloc(sizeof(node)); /* allocating ROOT Node */
    firstN->data = 1;
    firstN->right = NULL;
    firstN->left = NULL;

    /* why are you allocating RIGHT, it will automatically be allocated when you insert Node */
    //firstN->right = (node)malloc(sizeof(node)*10);
}