下面是我的调试结果,之前一直没有错,后面有问题,为什么?

,大概是调用到了4,5次的时候把,这是子函数内部的写函数,我往文件fp里写,已经写完了,打算去关闭的时候出现的。而且fp的值是有的,很奇怪,望高手指点
75 fclose(fp);
(gdb) p fp
$21 = (FILE *) 0x603fd0
(gdb) p fclose(fp)

Program received signal SIGSEGV, Segmentation fault.
0x0000003a8b25ff39 in fclose@@GLIBC_2.2.5 () from /lib64/libc.so.6
The program being debugged was signaled while in a function called from GDB.
GDB remains in the frame where the signal was received.
To change this behavior use "set unwindonsignal on".
Evaluation of the expression containing the function
(fclose@plt) will be abandoned.
When the function is done executing, GDB will silently stop.

函数式编程
浏览 95回答 2
2回答

慕运维8079593

(gdb) p fp$21 = (FILE *) 0x603fd0首先.p fp打印的是文件指针.也就是fp的指针地址.而是文件指针的内容...你应该使用 p *fp查看_fileno如果不为-1.则文件是被打开的.其实在fp前做个检查就好了 ...if(fp) fclose(fp);还有一种办法.如果你是LINUX的话.在调试的时候.在fclose之前打上断点.运行到断点的时候ps看下程序的PID.去proc里看下文件是否已经被关闭了...具体路径在/proc/PID/fdls -l一下.就可以看到打开了哪些文件.以及文件描述符.如果没有fopen打开的文件.就表示已经被关闭过了...

拉丁的传说

SIGSEGV 信号表示你引用了一个无效的,或者非法的内存区域;出现这个错误,肯定是你的 fp 指针无效,但不一定非法,所以 fclose 报错;你要保证你的文件打开成功,并且 fp 持有一个合法的文件指针,才能用 fclose 关闭文件;
打开App,查看更多内容
随时随地看视频慕课网APP