为什么“malloc”会改变我案例中无关的指针?

时间:2014-01-11 11:54:25

标签: c pointers data-structures malloc binary-search-tree

我正在尝试在C中实现二进制搜索树(BST)。我试图向BST添加几个元素,但是当我添加第三个元素时,代码不起作用。我在gdb中调试它并发现当它为新节点执行malloc时,第二个节点的父节点从正确的地址值更改为0x13

由于我觉得新节点的内存分配与旧节点的父节点之间没有关系,我不知道为什么会发生这种情况......

这是我的InsertBST功能:

int InsertBST(Bst *p, int val)
{
    PNode pnode = (PNode)malloc(sizeof(PNode));
    if (pnode != NULL)
    {
        pnode->data = val;
        pnode->lc = NULL;
        pnode->rc = NULL;
        if (p->root == NULL)
        {
            pnode->parent = NULL;
            p->root = pnode;
            p->size++;
            return 1;
        }
        else
        {
            PNode tem = FindVal(p->root, val);
            if (tem != NULL)
            {
                printf("Sorry, the value %d has appeared!\n", val);
                return 0;
            }
            else
            {
                tem = p->root;
                while (tem->lc != NULL && tem->rc != NULL)
                {
                    if (tem->data > val)
                        tem = tem->lc;
                    else
                        tem = tem->rc;
                }
                pnode->parent = tem;
                if (tem->data > val)
                {
                    tem->lc = pnode;
                }
                else
                {
                    tem->rc = pnode;
                }
                p->size++;
            }
            return 1;
        }
    }
    else
    {
        printf("Allocate memory failed!\n");
        return 0;
    }
}

p是指向这样结构的指针:

typedef struct BST
{
    PNode root;
    int size;
}Bst;

PNode是指向这样的结构的指针:

typedef struct NODE
{
    int data;
    PNode lc;
    PNode rc;
    PNode parent;
}Node;

1 个答案:

答案 0 :(得分:6)

malloc(sizeof(PNode))

将分配指针所需的内存,而不是它后面的节点结构。

尝试

malloc(sizeof(*PNode))

malloc(sizeof(Node))