C语言 初始化多个节点时出现分段故障



我正在研究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已经初始化。

在你的两个程序中都没有这样做。对未赋值的指针解引用是未定义的行为。它在您的第一个程序中工作只是偶然的。谁知道你在覆盖什么内存。

需要初始化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);
}

相关内容

  • 没有找到相关文章

最新更新