【问题标题】:Segment Fault On any file access C/SDL2任何文件访问 C/SDL2 上的段错误
【发布时间】:2017-04-21 21:30:52
【问题描述】:

当我运行这个函数时,我无法弄清楚为什么这个程序会出现段错误: 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.

【问题讨论】:

    标签: c file segmentation-fault sdl-2


    【解决方案1】:

    下次请至少启动调试器;如果不自己解决你的错误,你就不会走得太远。

    问题不是由有问题的代码引起的。在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"
    };
    

    字符串常量放在常量内存中,不允许修改。当您尝试更改此字符串时,会出现段错误,因为您尝试写入只读页面。

    可能最简单的解决方案是将类型更改为例如char Curl[5][32](确保大小足以容纳文件名)。

    顺便说一句,您对全局变量的过度使用会导致问题发生,foo() 并不是在 C 中定义不带参数的函数的方式(但它在 C++ 中)。

    【讨论】:

    • 谢谢,我知道全局变量在这里是个问题,只是想知道将它们放在哪里以及我最终会在哪里使用它们。否则我最终会将许多值传递到无尽的位置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-06
    • 1970-01-01
    • 2020-06-11
    相关资源
    最近更新 更多