C 我这里一直有一个分割错误。我已经做了4个小时了

C 我这里一直有一个分割错误。我已经做了4个小时了,c,pointers,struct,segmentation-fault,C,Pointers,Struct,Segmentation Fault,我真的需要一些帮助,因为我已经试着找到一个解决这个问题的办法好几个小时了,但没有任何效果 我有两个结构: typedef struct NODE { char* line; int count; struct NODE *left, *right; } NODE; typedef struct BST { NODE *root; } BST; 这些代码行看起来可疑: if (iflag == 0) { char curr_string[300];

我真的需要一些帮助,因为我已经试着找到一个解决这个问题的办法好几个小时了,但没有任何效果

我有两个结构:

typedef struct NODE {
    char* line;
    int count;
    struct NODE *left, *right;
} NODE;

typedef struct BST {
    NODE *root;
} BST;
这些代码行看起来可疑:

if (iflag == 0) {
    char curr_string[300];
    BST binary_tree;

    //fpointer_in = fopen(filename_in, "r");

    //while (!feof(fpointer_in)) {

        //fgets(curr_string, 300, fpointer_in);
        addTreeNode("Hello There!", binary_tree.root); // Adds the node to the binary tree.

    //}
    NODE *cpy = malloc(sizeof(NODE));
    cpy->line = calloc(25, sizeof(char));

    cpy->count = 0;
    cpyNode(cpy, binary_tree.root);

    free(cpy);
    free(binary_tree.root);
    //printf("%s\n", cpy->line);
    //free(binary_tree.root);
    //fclose(fpointer_in);
}
这是addTreeNode函数:

void addTreeNode(char* line_string, NODE* root) {

    if (root == NULL) {
        root = calloc(25, sizeof(char)); // 25 is a test var.
        root->line = calloc(25, sizeof(char)); // 25 is a test variable.
        strcpy(root->line, line_string);
        root->count = 0;    
    }
    else {
        NODE *add_node = malloc(sizeof(NODE));
        add_node->line = calloc(25, sizeof(char)); // 25 is a test variable.
        strcpy(add_node->line, line_string);

        while (root != NULL) {
            if (strcmp(line_string, root->line) < 0 && root->left == NULL) {
                //cpyNode(node_ptr->left, add_node);
            }
        }
    }
}
addTreeNode函数中的if块已经过测试,但我还没有测试else块。无论如何,它从未被使用过,所以我不认为这是一个问题


这里的问题是,在程序到达main之前,我就遇到了一个分割错误。当我注释掉cpyNodecpy,binary_tree.root;声明,然后它就工作了。然后我继续注释掉整个cpyNode函数减去第一行。我发现第一行给了我一个分段错误,我不知道为什么。非常感谢您的帮助。

您可能还有其他错误,但这些是您需要解决的问题:

if(iflag == 0){
    char curr_string[300];
    BST binary_tree;
这里,二叉树是未初始化的

        addTreeNode("Hello There!", binary_tree.root);
        //Adds the node to the binary tree.
您希望此调用将节点添加到树中,但您正在按值传递未初始化的根成员,因此在函数调用返回后指针将保持其未初始化状态


您应该修改addTreeNode函数以接受指向BST的指针,并将二进制树的地址传递给该函数。

我是否遗漏了什么?您已经将问题缩小到cpyNode函数中的一行,但是您从未发布cpyNode函数本身?在到达main之前,您怎么会得到segfault?你的测试有错吗?顺便说一句,我喜欢代码底部的大括号艺术。甚至在程序到达main之前。当有人对一个C程序提出这样的特殊要求时,通常意味着他们不理解标准输出是行缓冲的。发布一个最小但完整的程序,仍然显示问题。否则我们只是猜测,很难帮助您。@WeatherVane在到达main之前,您怎么会遇到segfault?可能是错误的链接器文件,例如RO内存中的.data段。但事实并非如此,你应该经常检查malloc等人的返回值。伙计,我真是个白痴!谢谢你的帮助。我之所以没有添加更多代码,是因为它的其余部分几乎只是一个空框架。虽然我认为我可以发布cpyNode函数:/。关于传递BST指针,引用节点的成员作为BST指针->节点指针->成员安全吗?在任何情况下,您必须访问BST头节点的成员,是否有方法引用它,以便它更易于阅读和安全?