任何文件访问时出现段错误 C/SDL2
Segment Fault On any file access C/SDL2
我无法弄清楚为什么这个程序在我 运行 这个函数时会出现段错误:
https://github.com/biohazard-hack/high-hand/blob/master/events.c#L73
我有这个程序的另一个版本,它是一个草稿,就在这里:
http://pastebin.com/TgiqM9tX
我知道我在当前版本中读取文件的方式是错误的,但是当我使用 fscanf() 或任何访问文件时它会出现段错误。
它将以文本或二进制读取方式打开文件 mod 很好,但是第二次我从中读取任何类型的文件时,它就爆炸了。
(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.
下次请至少启动调试器;如果不自己解决错误,你就走不了多远。
问题不是由有问题的代码引起的。在 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++ 中)。
我无法弄清楚为什么这个程序在我 运行 这个函数时会出现段错误: https://github.com/biohazard-hack/high-hand/blob/master/events.c#L73
我有这个程序的另一个版本,它是一个草稿,就在这里: http://pastebin.com/TgiqM9tX
我知道我在当前版本中读取文件的方式是错误的,但是当我使用 fscanf() 或任何访问文件时它会出现段错误。
它将以文本或二进制读取方式打开文件 mod 很好,但是第二次我从中读取任何类型的文件时,它就爆炸了。
(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.
下次请至少启动调试器;如果不自己解决错误,你就走不了多远。
问题不是由有问题的代码引起的。在 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++ 中)。