feof 函数 while循环引发的断错误及调试方法

学习lex and yacc,例子ch1-05.*

执行命令 如下:

               lex   ch1-05.l

               bison  -d  ch1-05.y

               cc   -c   lex.y.c   ch1-05.tab.c

               cc   -o   ch105     lex.yy.o    ch1-05.tab.o  -ll

          执行 ./ch105提示有”断错误“

 

gdb调试:

             $ cc  -g  -rdynamic lex.yy.c ch1-05.tab.c -ll
             $ gdb ./a.out
                     一些版本信息。。。。
                (gdb) r
                    Starting program: /home/kevin/kevin/project/test/a.out
                  
                     Program received signal SIGSEGV, Segmentation fault.
                    0x009b5e10 in feof () from /lib/libc.so.6
                    Missing separate debuginfos, use: debuginfo-install glibc-2.9-3.i686
             (gdb)  bt
                   #0  0x009b5e10 in feof () from /lib/libc.so.6
                  #1  0x0804b2c5 in main () at ch1-05.y:30
退出GDB调试,打开
ch1-05.y文件,第30行开始的源码如下

            while(!feof(yyin)) {

                      yyparse();

            }

原因:因为feof函数是应先读取然后再判断是否到文件结尾,所以上述循环应该改为

           do

            {

                    yyparse();

            }

           while(!feof(yyin));

 

 

重新执行命令:

                  bison  -d  ch1-05.y

                 cc   -c   lex.y.c   ch1-05.tab.c

                 cc   -o   ch105     lex.yy.o    ch1-05.tab.o  -ll

执行  $./ch105

成功。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值