我正在使用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);
}
我遇到了段错误。任何想法为什么会发生这种行为?
答案 0 :(得分:0)
您尚未为节点或node2分配内存。由于两个指针都在堆栈上分配,因此它们将具有垃圾值。它只是第一个程序通过的偶然事故。
答案 1 :(得分:0)
此功能:
void initNode(Node* node, int* data){
node->data = data;
node->leftChild = NULL;
node->rightChild = NULL;
node->parent = NULL;
}
预计node
已初始化。
您不会在任何一个程序中执行此操作。取消引用尚未分配的指针是未定义的行为。它只是偶然的,它在你的第一个程序中起作用。谁知道你要覆盖什么记忆。
您需要初始化node
和node2
。
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);
}