Linux下。C语言构建中序线索二叉树树,GCC编译,运行后提示:段错误(吐核)

高手来看看
上的_c语言吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:469,568贴子:
高手来看看
#include &stdio.h&#include &stdlib.h&#define LEN sizeof(struct stu)struct stu *creat();int count(int *ag, int *sum, struct stu *p);struct stu {
char name[20]; char sex[5]; int course[3]; struct stu *};int main(){ int *ag, * ag=sum=(int *)malloc(sizeof(int)); struct stu *p; p=creat(); int i=0; count(ag, sum, p); while(p-&uid != 0) { printf("Stu_id:%d Name:%s Sex:%s Age:%d Course[0]:%d Course[1]:%d Course[2]:%d\n",p-&uid, p-&name, p-&sex, p-&age, p-&course[0], p-&course[1], p-&course[2]); printf("Average:%d Sum:%d\n",*(ag+i),*(sum+i)); p=p-&}
}struct stu *creat(){struct stu *head, *p1, *p2;int n=0;p1=p2=(struct stu *)malloc(LEN);scanf("%d %s %s %d %d %d %d",&p1-&uid, &p1-&name, &p1-&sex, &p1-&age, &p1-&course[0], &p1-&course[1], &p1-&course[2]);head = NULL;while(p1-&uid != 0){n+=1;if(n == 1){head=p1;}else{p2-&next=p1;}p2=p1;p1=(struct stu *)malloc(LEN);scanf("%d %s %s %d %d %d %d",&p1-&uid, &p1-&name, &p1-&sex, &p1-&age, &p1-&course[0], &p1-&course[1], &p1-&course[2]);}p2-&next=NULL;return (head);}int count(int *ag, int *sum, struct stu *p){ int i=0; while(p-&uid != 0) { *(sum+i)=(p-&course[0]+p-&course[1]+p-&course[2]); *(ag)=(*(sum+i)/3); i+=1; }}
c语言一般需要4-8周,就可以掌握.4个月=两年的工作经验,月薪过万.c语言的费用根据培训课时定,免费试听编程课程,名师授课,手把手传教.
这么点代码gdb单步调, 或者gdb直接运行到段错误,看下栈顶
For bug reporting instructions, please see:&&...Reading symbols from /home/wangxiaolin/homework/text...(no debugging symbols found)...done.这是什么意思
刚用的linux 我对gdb 还不熟
Reading symbols from /home/wangxiaolin/homework/text...done.(gdb) l13
char sex[5];14
int course[3];16 17
struct stu *18 };19 int main()20 {21
int *ag, *22
ag=sum=(int *)malloc(sizeof(int));(gdb) 还有这些
给了一部分
程序。。。。
搜一搜gdb的用法。首先编译的时候不要开优化,并且打开调试信息(-O0 -g3)。进入gdb后:file 可执行文件路径set args 执行参数r
执行b 打断点p 打印变量n 单步s 单步进入Ctrl+x a 打开 gdb tiny UI,再按一遍关上
Breakpoint 1,
creat () at second.c:6161 return (head);Missing separate debuginfos, use: debuginfo-install glibc-2.14.90-24.fc16.6.x86_64到这里停住了莫非我少了一个软件包?
这是因为系统安装的glibc是不带调试信息的,可以通过安装一个带调试信息的glibc解决,这种包一般源里面都有,根据你的发行版安装即可。
大神,能给看看代码哪儿有问题吗?
我安装时说没有相应的软件包。。。
我可以帮你调这个程序,但不能一直帮你调程序。你的发行版是什么?
yum install glibc-devel试试
已加载插件:langpacks, presto, refresh-packagekit设置安装进程包 glibc-devel-2.14.90-24.fc16.6.x86_64 已安装并且是最新版本无须任何处理。。。。。
Program received signal SIGSEGV, Segmentation fault. 0x0853 in count (ag=0x601010, sum=0x601010, p=0x0) at second.c:6868 while(p-&uid != 0)我再试了下,出现这个。是不是错误
Program received signal SIGSEGV, Segmentation fault. 0x0853 in count (ag=0x601010, sum=0x601010, p=0x0) at second.c:6868while(p-&uid != 0)我再试了下,出现这个。是不是错误
是的,现在已经可以调试了。这句话是说你的程序收到SIGSEGV信号,发生了段错误。看样子可能是函数count中的指针p指向了不合法的地址。而count函数中的指针是create返回的,你的create函数的逻辑有问题,你用单步跟踪的方法调试一下看看(用眼看也可以,不过用gdb可以练习一下调试)。
Program received signal SIGSEGV, Segmentation fault.0x0853 in count (ag=0x601010, sum=0x601010, p=0x0) at second.c:6868 -&sex, &p1-&age, &p1-&course[0], &p1-&course[1], &p1-&course[2]);它说scanf那行有问题,但是那是我参考书上标准的创建链表的函数。。。
你的create函数在输入次数大于1的时候会返回NULL,你检查看看是不是。
应该不会吧,那里在循环外面首先有一个scanf ,n在内面是从1开始的,head总会指向第一个的
你看书不认真,%s就不需要&了。
各位老大谢谢你们,特别ervin_zhao 让我学会了gdb,还有最后那位,尽管%s那个之前已经改过来了,原因找到了:因为我的p -&uid 为0是结束条件,但是尽管最后会输入,却不会指向它,因为p2-&next指向了null,所以输出时的结束条件应与null判断。还是很谢谢大家!
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或linux下c语言编程 打印文件类型,总是出现段错误,查不出错误,求大神_百度知道gcc这个大名鼎鼎的编译器软件,如果你用UNIX类系统,当然包括Linux,一定要知道。gcc - GNU project C and C++ compiler1、基本用法一般用作C语言编译器时是gcc,而用作C++语言编译器时是g++。其语法结构为:
gcc [-c|-S|-E] [-std=standard]
[-g] [-pg] [-Olevel]
[-Wwarn...] [-pedantic]
[-Idir...] [-Ldir...]
[-Dmacro[=defn]...] [-Umacro]
[-foption...] [-mmachine-option...]
[-o outfile] infile...虽然看起来选项非常多,好象挺高深的。但只有一个infile是必需选项,故我们初学者只需要知道这样的形式就行了:gcc source-files即用任何一种文本编译器编写C语言源程序,保存为一个UNIX下格式的文本文件,比如文件名为test.c,那么用下面这个命令把源程序变成可执行程序就行了:gcc test.c如果你是用Windows下的文件编辑软件写的源程序,在用gcc编译之前最好用命令dos2unix转换一下文件格式。因为早期的gcc版本不能识别windows下的文件格式。会报奇怪的错误。dos2unix命令由软件包tofrodos提供,软件包信息如下:Description: Converts DOS &-& Unix text files, alias tofromdos DOS text files traditionally have CR/LF (carriage return/line feed) pairs as their new line delimiters while Unix text files traditionally have LFs (line feeds) to terminate each line. . Tofrodos comprises one program, "fromdos" alias "todos", which converts text files to and from these formats. Use "fromdos" to convert DOS text files to the Unix format, and "todos" to convert Unix text files to the DOS format. . This functionality is also available via the dos2unix/unix2dos symlinks. .
Homepage: /tofrodos/index.shtml即实现Windows文本文件格式和Linux文本文件格式的转换。因为Windows下文本文件以CR和LF行结束符,而Linux下文本文件以LF作为行结束符。所以在Linux下编写的文本文件到Windows下用记事本等软件打开时会出现所有内容挤在一行的现象。用C语言的习惯来说就是:Windows下文本文件行结束符是'\r'和'\n'而Linux下是'\n',即Windows下是十六进制的0x0d和0x0a,而Linux下是0x0a用上面的编译命令:gcc test.c将在当前目录下产生一个可执行程序a.out,要运行程序试试?输入命令:./a.out如果想要产生一个自己命令的程序,即程序名不是默认的a.out,可以用这种命令格式:gcc -o out-file source-file比如:gcc -o myprog test.c将到源程序test.c变成一个可执行程序myprog,运行这个命令看看你的成果吧:./myprog2、编译多个文件如果你的程序源代码比较多,并且分在几个源文件里面,互相之前有调用现象,就要用gcc编译多个源文件了。命令格式如下:gcc -o out-file source-file-a source-file-b source-file-c ...可以把所有源代码文件联合编译生成一个程序out-file3、代码风格很多人都会讲代码风格问题,但这应该是机器做的事而不是人做的事!Linux下有一个很好的软件indent可以用来把代码按照一定的风格进行整理。该软件包信息如下:Description: C language source code formatting program The `indent' program changes the appearance of a C program by inserting or deleting whitespace. . `indent' also provides options for controlling the alignment of braces and declarations, program indenting, and other stylistic parameters, including formatting of both C and C++ comments.比如我们编写了一个源程序test.c,代码格式比较乱,如下:#include &stdio.h&#include &string.h&#include &stdlib.h&int main(int argc, char **argv){
int port = 0;
printf("program begin\n");
if (argc != 3) {
printf("程序参数个数不对!正确输入方法如下:\n%s ip-address port\n", argv[0]);exit(0);
if(atoi(argv[2]) &0 || atoi(argv[2]) & 65535) {printf("端口输入不对!应该是0-65535的值。程序取默认值3456\n"); port = 3456;}
else port = atoi(argv[2]);
printf("命令如下:%s %s %d\n", argv[0], argv[1], port);
return 0;}用indent命令格式化一下,命令如下:indent test.c源代码变成下面的样子了:#include &stdio.h&#include &string.h&#include &stdlib.h&intmain (int argc, char **argv){
int port = 0;
printf ("program begin\n");
if (argc != 3)
("程序参数个数不对!正确输入方法如下:\n%s ip-address port\n",
if (atoi (argv[2]) & 0 || atoi (argv[2]) & 65535)
("端口输入不对!应该是0-65535的值。程序取默认值3456\n");
port = 3456;
port = atoi (argv[2]);
printf ("命令如下:%s %s %d\n", argv[0], argv[1], port);
return 0;}这种代码风格是GNU的风格,是indent的默认格式。但我们多数写程序的人可能都是学的Kernighan & Ritchie代码风格,用如下命令格式化:indent -kr test.c代码格式化成这样了:#include &stdio.h&#include &string.h&#include &stdlib.h&int main(int argc, char **argv){
int port = 0;
printf("program begin\n");
if (argc != 3) {
("程序参数个数不对!正确输入方法如下:\n%s ip-address port\n",
if (atoi(argv[2]) & 0 || atoi(argv[2]) & 65535) {
("端口输入不对!应该是0-65535的值。程序取默认值3456\n");
port = 3456;
port = atoi(argv[2]);
printf("命令如下:%s %s %d\n", argv[0], argv[1], port);
return 0;}记住:本该机器来做的事,不要手工去做!当然,如果你用indent格式化时报错或格式化后发现不对劲,一定是你的代码里有问题,比如少了一个&}&4、养成好的习惯大家都写C程序,可有人的代码总会有问题,而写得好一点的就会基本没错误。这需要一个慢慢练习的过程,但作为初学者,你在编译程序时就加上gcc的-Wall选项吧。即命令格式为:gcc -Wall -o out-file source-file这样,程序中每行代码有问题都有提到提示。初学者把每个Warning和Error都弄清楚对养成好的编程习惯是相当有用的。5、为调试程序作准备可能我们的程序编译通过了,也生成了可执行程序,但可能运行的时候出错,甚至刚开始运行一段时间都没问题后来某一天出了问题。有些问题一看错误提示就明白了。但有些可能花较长时间都想不明白,只能调试程序了。为了保证可以调试程序,我们在用gcc编译程序时要加上-g选项,即命令格式如下:gcc -Wall -g -o out-file source-file这个命令就会把源代码编译产生的可执行程序里加上调试信息,如果程序出错出现Core dump文件时可以从Core dump文件里快速定位到程序哪行出了问题。
转自:/6099379.html&
阅读(...) 评论()帮忙看下以下的C语言程序,哪里有问题了,为什么Linux上编译执行会出现段错误呢?求助。。、。_百度知道posts - 0,&
comments - 1,&
trackbacks - 0
&&&&GCC是Linux操作系统下一个非常重要的源代码编译工具,有着许多重要的选项,支持许多不同语言的编译,如C、C++、Ada、Fortran、Objective、Perl、Python、Ruby以及Java等,甚至Linux的许多内核和许多其他自由软件以及开放源码应用程序都是用C语言编写并经gcc编译而成的.
&&& 1.编译单个源文件
&&& [例如]在屏幕上打印"Hello,Linux."
&&& [源代码]
&&& #include&stdio.h&
&&& #include&stdlib.h&
&&& int main(int argc,char **argv)
&&&&&&& printf("Hello,Linux.\n");
&&&&&&& exit(0);
&&& 将源文件保存为hello.c,开始进行编译
&&& $gcc -o hello hello.c
&&& 编译成功完成后,在当前路径下,生成一个名为hello的文件,然后执行
&&& $./hello
&&& 在屏幕上,你将会看到打印结果:Hello,Linux.
&&& 说明:在默认情况下,编译成功完成后,会在当前路径下,生成一个名为a.out的文件,然后执行$./a.out便可打印结果,但通常可以通过选项-o来指定自己的可执行程序名称;
&&& 2.编译多个源文件
&&& 3.使用外部函数库
&&& 4.使用共享函数库和静态函数库
&&& 5.gcc选项详细描述
阅读(...) 评论() &

我要回帖

更多关于 二叉树线索化 的文章

 

随机推荐