我正在尝试学习C指针这些天,当我尝试处理字符串和指针时,链接列表我经常遇到分段错误。我无法解决这些问题(我无法找到发生分段错误的确切行)。我的问题是:
在我的代码中找到包含分段错误的行的工具是什么?
您是否有任何材料(书籍或教程)建议我了解与细分错误,原因和解决方案相关的所有问题?
gdb输出:
/home/sri/Documents/projects/practice/c/strings/a.out...done.
(gdb) run
Starting program: /home/sri/Documents/projects/practice/c/strings/a.out
Missing separate debuginfo for /lib64/ld-linux-x86-64.so.2
Try: zypper install -C "debuginfo(build-id)=ecb8ef1a6904a2a3ec60a527f415f520c8636158"
Missing separate debuginfo for /lib64/libc.so.6
Try: zypper install -C "debuginfo(build-id)=bd1473e8e6a4c10a14731b5be4b35b4e87db2af7"
this is print1 char *p
Program received signal SIGSEGV, Segmentation fault.
0x00000000004005dd in do_print2 (p=0x7fffffffdda0) at string_orguments.c:16
16 strcat(p[0],"added");
(gdb)
答案 0 :(得分:3)
由于OS检测到进程的内存权限违规 - 对有效内存的无效访问会产生:SIGSEGV
。
在输出中:
Program received signal SIGSEGV, Segmentation fault.
0x00000000004005dd in do_print2 (p=0x7fffffffdda0) at string_orguments.c:16
16 strcat(p[0],"added");
在strcat(p[0],"added");
处显示您正在尝试写入只读的内存 - 对有效内存的无效操作。
注意:strcat
函数在第一步尝试在第a
位于"added"
的位置从第二个参数字符串文字\0
写入char p[0]
。所以你可能得到信号SIGSEGV
,因为写操作无效代替\0
(可能在只读存储器上写入)。
另请注意:访问无效地址会显示:SIGBUS
阅读:strcat() implementation works but causes a core dump at the end要更好地理解。
在算法上查找分段错误是无法解决的问题,您没有任何工具(自动化工具)用于此目的。但只有这样才能使用gdb
类工具来破坏您的代码。
另外,为了避免分段错误,请准确读取语言主体/ ruls。您应该清楚为什么会出现分段错误。那么只有通过实践和经验,你才能学会如何编写更少的错误和更多可调试的代码。
此外,您应该了解运行时发生的分段错误。可能是您的代码对某些值集合运行良好,但对某些值集合则不行。因此,在编译时无法检测到分段。
这也说明了为什么它无法解决的问题,因为我们不能编写生成随机无限输入的通用算法,并测试你的代码是否完美运行!