当我运行此函数时,我无法弄清楚为什么这个程序是Segment故障: https://github.com/biohazard-hack/high-hand/blob/master/events.c#L73
我有这个程序的另一个版本,这是一个粗略的草案,它在这里: http://pastebin.com/TgiqM9tX
我理解我在当前版本中读取文件的方法是错误的,但是当我使用fscanf()或任何东西来访问文件时它会出现故障。
它将以文本或二进制读取模式打开文件,但第二次我从中进行任何类型的读取,它会爆炸。
(gdb)运行 启动程序:/ home / tracer / code / rcg / high-hand / high-hand [使用libthread_db启用的线程调试] 使用主机libthread_db库“/lib/x86_64-linux-gnu/libthread_db.so.1”。 信息:手不是空
这是使用来自gdb的fscanf()的输出:
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7537686 in _IO_vfscanf_internal (s=s@entry=0x9ee820,
format=<optimized out>, argptr=argptr@entry=0x7fffffffdc78,
errp=errp@entry=0x0) at vfscanf.c:843
843 vfscanf.c: No such file or directory.
答案 0 :(得分:0)
下次请至少启动调试器;如果不自己解决错误,你就不会走得太远。
问题不是由相关代码引起的。在main.h
中有extern char* Curl[5];
,但在main.c
中,它初始化为:
char* Curl[5] ={ "img/cards/rj.png",
"img/cards/rj.png",
"img/cards/rj.png",
"img/cards/rj.png",
"img/cards/rj.png"
};
字符串常量放在常量内存中,不允许修改。当您尝试更改此字符串时,由于您尝试写入只读页面,因此会出现段错误。
可能最简单的解决方案是将类型改为例如<{1}} {确保大小足以保存文件名)。
作为旁注,你过度使用全局变量会导致问题发生,char Curl[5][32]
不是如何在C中定义不带参数的函数(但它在C ++中却是如此)。