在C语言中,我遇到了分段错误,我不知道为什么

在C语言中,我遇到了分段错误,我不知道为什么,c,binary-search-tree,C,Binary Search Tree,我正在制作一个二进制搜索树,在一个实例中存储多个内容,我遇到了两个错误。第一个发生在函数insert use to work in中,而不是随机停止,第二个发生在print_tree_inorder中,我不知道为什么会被破坏 代码中有几个问题。首先它已被弃用 看起来在n,p,id,h,pph变量的声明上有些混乱。本声明: char* n,p,id,h,pph; scanf("%s", &p); 仅将n声明为char*类型,其余变量p、id、h、pph声明为char类型 让我们谈谈编译

我正在制作一个二进制搜索树,在一个实例中存储多个内容,我遇到了两个错误。第一个发生在函数insert use to work in中,而不是随机停止,第二个发生在print_tree_inorder中,我不知道为什么会被破坏


代码中有几个问题。首先它已被弃用

看起来在n,p,id,h,pph变量的声明上有些混乱。本声明:

char* n,p,id,h,pph;
scanf("%s", &p);
仅将n声明为char*类型,其余变量p、id、h、pph声明为char类型

让我们谈谈编译器报告的警告,我正在使用gcc编译器并在编译期间提供-Wall和-Wextra选项:

$ gcc -Wall -Wextra prg.c 
prg.c:56:26: warning: format specifies type 'char *' but the argument has type 'char **' [-Wformat]
             scanf("%s", &n);
                    ~~   ^~
prg.c:61:24: warning: incompatible integer to pointer conversion assigning to 'char *' from 'char'; take the address with & [-Wint-conversion]
             number[i] = p;
                       ^ ~
                         &
prg.c:64:23: warning: incompatible integer to pointer conversion assigning to 'char *' from 'char'; take the address with & [-Wint-conversion]
             hours[i] = h;
                      ^ ~
                        &
prg.c:68:21: warning: incompatible integer to pointer conversion assigning to 'char *' from 'char'; take the address with & [-Wint-conversion]
             pPH[i] = pph;
                    ^ ~~~
                      &
prg.c:35:15: warning: unused variable 'id' [-Wunused-variable]
    char* n,p,id,h,pph;
              ^
5 warnings generated.
您不应忽略编译器警告消息。他们在那里是有原因的

警告1: n是char*类型,因此&n是char**类型。scanf中的%s格式说明符要求参数作为数组,并且该数组必须有空间容纳至少输入\u size+1个字符

您应该将n声明为字符数组,如下所示:

char n[50];
// and for input
scanf("%49s", n);
警告2:

p为char类型,数字[i]为char*类型。因此,分配是不兼容的。&p也是char*类型,这就是为什么编译器没有报告任何关于语句的警告:

char* n,p,id,h,pph;
scanf("%s", &p);
但这是不正确的,因为p是char类型的,它没有足够的空间用于字符串输入。阅读有关的格式说明符的更多信息

你可以做:

char p[50];
// and for input
scanf("%49s", p);
number[i] = strdup(p);
如果不使用strdup,则number数组的所有指针最终都指向同一位置。或者,您可以将p声明为char*并显式处理内存分配/释放操作。一旦使用完strdup,请确保释放它返回的内存。警告3和警告4的解释相同

警告5: 从代码中删除未使用的变量


您的代码还有改进的余地。试着自己找出答案。

Review char*n。。。。扫描%s,&n;。保存的名称在哪里?这是后面的代码。呼叫扫描%s保存的名称在哪里(&n)?n是指向任何地方的指针。扫描%s,&n;应该引起警告的。您使用的是什么编译?这段代码有很多地方,比我所期望的C新手要多得多。回顾如何读取一行用户输入并保存为字符串,然后稍后打印。char-buf[80];scanf%79s,buf;printf%s\n,buf;您还可以删除insert方法中的第二个strcmp。@GlenvillePecor-将警告视为错误这将真正帮助我!