flex、bison和readline:奇怪的段错误 GNUGDB(gdb)7.5-ubuntu 版权所有(C)2012免费软件基金会。 许可证GPLv3+:GNU GPL版本3或更高版本 这是自由软件:您可以自由更改和重新发布它。 在法律允许的范围内,不存在任何担保。键入“显示复制” 和“显示保修”了解详细信息。 此GDB配置为“i686 linux gnu”。 有关错误报告说明,请参阅: ... 正在从/path/to/drcalc…读取符号(未找到调试符号)…已完成。 (gdb)r 启动程序:/path/to/cdrcalc 程序接收信号SIGSEGV,分段故障。 0xb7e606b6英寸??()来自/lib/i386 linux gnu/libc.so.6 (gdb)

flex、bison和readline:奇怪的段错误 GNUGDB(gdb)7.5-ubuntu 版权所有(C)2012免费软件基金会。 许可证GPLv3+:GNU GPL版本3或更高版本 这是自由软件:您可以自由更改和重新发布它。 在法律允许的范围内,不存在任何担保。键入“显示复制” 和“显示保修”了解详细信息。 此GDB配置为“i686 linux gnu”。 有关错误报告说明,请参阅: ... 正在从/path/to/drcalc…读取符号(未找到调试符号)…已完成。 (gdb)r 启动程序:/path/to/cdrcalc 程序接收信号SIGSEGV,分段故障。 0xb7e606b6英寸??()来自/lib/i386 linux gnu/libc.so.6 (gdb),bison,readline,flex-lexer,Bison,Readline,Flex Lexer,有人能帮忙吗?我的代码可以在branchreadline下载,您应该使用-g标志进行编译,这样gdb就可以显示更多的调试信息。如果您这样做,您将看到程序在尝试使用sh_line时在函数inp_readline中崩溃,该函数为空 原因是您将sh_-line0(将被解释为空指针)作为其初始值,然后在inp_-readline中检查sh_-line是否为非空,在这种情况下,您将释放旧字符串并使用readline读取新字符串。但是如果它是空的,它在开始时是空的,什么也不做,所以当你到达strlen(sh

有人能帮忙吗?我的代码可以在branch
readline
下载,您应该使用-g标志进行编译,这样gdb就可以显示更多的调试信息。如果您这样做,您将看到程序在尝试使用sh_line时在函数inp_readline中崩溃,该函数为空

原因是您将sh_-line0(将被解释为空指针)作为其初始值,然后在inp_-readline中检查sh_-line是否为非空,在这种情况下,您将释放旧字符串并使用readline读取新字符串。但是如果它是空的,它在开始时是空的,什么也不做,所以当你到达strlen(shu行)它仍然是空的,并且strlen崩溃

编辑:

原文是这样写的

GNU gdb (GDB) 7.5-ubuntu
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /path/to/drcalc...(no debugging symbols found)...done.
(gdb) r
Starting program: /path/to/cdrcalc 

Program received signal SIGSEGV, Segmentation fault.
0xb7e606b6 in ?? () from /lib/i386-linux-gnu/libc.so.6
(gdb) 
但是你加了一些大括号,所以它说

if (sh_line) free(sh_line);sh_line=0; 
sh_line = readline(sh_Prompt);
这就是为什么readline从未接到电话。

(我是询问者!)
我对readline一无所知。因此,一个好的函数定义将起作用。

我选择了

那么我应该如何修复它?我对readline一无所知,只是做了一次复制粘贴编辑。对不起,我用另一种方式修复了它。
if (sh_line) {free(sh_line);sh_line=0;
sh_line = readline(sh_Prompt);}