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头节点的成员,是否有方法引用它,以便它更易于阅读和安全?