初始化多个节点时的段故障

时间:2015-10-06 03:16:55

标签: c initialization malloc binary-search-tree

我正在使用C中的二叉搜索树。我在初始化多个节点时遇到问题。

typedef struct Node Node;

struct Node{
    int* data;
    Node* leftChild;
    Node* rightChild;
    Node* parent;
};

void initNode(Node* node, int* data){
    node->data = data;
    node->leftChild = NULL;
    node->rightChild = NULL;
    node->parent = NULL;
}

上面的代码似乎只在调用initNode()一次时正常工作。但是,如果我尝试进行第二次调用,则会出现段故障。

我的主要看起来像这样:

int main(){
    Node* node;
    Node* node2;
    int a = 12;
    int b = 15;

    initNode(node, &a);

    printf("%i \n", *node->data);

}

这很有效。但是,如果我这样做:

int main(){
    Node* node;
    Node* node2;
    int a = 12;
    int b = 15;

    initNode(node, &a);
    initNode(node2, &b);

    printf("%i \n", *node->data);

}

我遇到了段错误。任何想法为什么会发生这种行为?

2 个答案:

答案 0 :(得分:0)

您尚未为节点或node2分配内存。由于两个指针都在堆栈上分配,因此它们将具有垃圾值。它只是第一个程序通过的偶然事故。

答案 1 :(得分:0)

此功能:

void initNode(Node* node, int* data){
    node->data = data;
    node->leftChild = NULL;
    node->rightChild = NULL;
    node->parent = NULL;
}

预计node已初始化。

您不会在任何一个程序中执行此操作。取消引用尚未分配的指针是未定义的行为。它只是偶然的,它在你的第一个程序中起作用。谁知道你要覆盖什么记忆。

您需要初始化nodenode2

Node* node = malloc(sizeof*node);
Node* node2 = malloc(sizeof*node2);

一旦你完成了它们,就记得free

更清晰的解决方案是在堆栈上分配Node,因此您不必担心调用free

int main(void) { /* use a valid signature for main() */
    Node node; /* just a straight up Node (not a pointer) */
    Node node2;
    int a = 12;
    int b = 15;

    initNode(&node, &a); /* use address of operator on nodes */
    initNode(&node2, &b);

    printf("%i \n", *node->data);
}