我正在研究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()一次时,上面的代码似乎工作得很好。但如果我尝试拨打第二个电话,我得到一个段故障。
我的main是这样的:
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);
}
我得到一个段错误。知道为什么会发生这种行为吗?
您没有同时为node或node2分配内存。由于两个指针都是在堆栈上分配的,因此它们将具有垃圾值。第一个程序通过只是偶然。
此函数:
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);
}