2

我遇到了一个问题,即在第一个节点之后,我没有为节点提供足够的内存,例如,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;
}

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

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

对我来说有趣的是,虽然上述方法有效,但通常执行 (node)malloc(sizeof(node)) (没有乘以 10)对于第二个实例 firstN->right 不起作用。

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

4

2 回答 2

9

这:

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

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

你需要:

t = malloc(sizeof *t);

请注意这有多简单?演员表是个坏主意,因此应该将其删除。而且大小是错误的,所以让编译器计算它。

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

此外,typedef在 C 中使用隐藏指针通常不是一个好主意,因为指针很重要,而且很快就会变得混乱。

于 2012-11-27T07:36:34.863 回答
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);
}
于 2012-11-27T08:31:49.387 回答