2015-10-06 74 views
0

我正在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

你需要malloc你的节点 –

+0

我有malloc在函数调用,但这似乎并不奏效。但是,如果我有主的话,它确实有效。任何想法,为什么这是? –

+0

您将内存分配给@Orel指向的'node'? – ameyCU

回答

0

您还没有为节点或节点2分配内存。由于这两个指针都在堆栈上分配,它们将具有垃圾值。它只是第一个程序通过的意外。

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 S,所以你不必担心通话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); 
}