2012-11-27 39 views
2

,我想出了一个问题,在这里我就不给我的节点给予足够的内存后,第一个,当我做,例如,firstNode = (node)malloc(sizeof(node))给予足够的内存。 以下是使用malloc函数的* node和insert函数的结构。二叉搜索树的malloc不是为以下节点

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

这里是主其中我测试使用malloc插入过程(I没有使用以上所定义的插入功能,因为我仍然在主测试逐行)()。

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->右。

我不知道为什么代码没有给予足够的内存,如果这是正确的情况下。

回答

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中通常是一个坏主意,因为指针重要的是,它很快就会变得混乱。

+0

哇哦,它看起来这样的方式更简单。非常感谢。但如果你不介意的话,这是一个后续问题。为什么我们不能做malloc(sizeof * node)呢?我试过了,但没有奏效。此外,我只是尝试编译没有铸造,它会工作不幸,说void *不是类型节点.. :( – meany

+1

@meany如果编译器抱怨丢失的转换,你编译为C++而不是C你不能写'malloc(sizeof * node)',因为'node'是一个类型,而不是你可以解引用的指针(尽管'malloc(sizeof * n)'中的指针'n'不被解引用',其中的表达式'* n'只用于确定类型,以及所需的大小) –

+0

如果没有转换就不编译,那么你不使用C编译器,而且你不能做'sizeof * node'是因为'* node'不是一个有效的表达式,因为'node'是一个类型,而不是一个值。 – melpomene

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