段故障对任何文件访问C / SDL2

时间:2016-12-07 03:37:43

标签: c file segmentation-fault sdl-2

当我运行此函数时,我无法弄清楚为什么这个程序是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.

1 个答案:

答案 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 ++中却是如此)。