Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有人能帮我确定C中Seg故障的原因和gdb输出的含义吗?_C_Linux_Segmentation Fault_Gdb - Fatal编程技术网

有人能帮我确定C中Seg故障的原因和gdb输出的含义吗?

有人能帮我确定C中Seg故障的原因和gdb输出的含义吗?,c,linux,segmentation-fault,gdb,C,Linux,Segmentation Fault,Gdb,当我运行这个程序时,如果它运行正常,它会打印出“SUCCESS!!!!”,但是我不断地遇到seg故障,我似乎不知道在哪里。有人能帮我确定究竟是什么导致信号SIGABRT,以及最有可能导致分段错误的原因是什么 我的代码是用c写的 编辑: 在第97行的主代码中,我有函数fclose(fp),但我应该已经在另一个函数中通读了它。这是我在main.c中的代码: FILE *fp = NULL; if(fp = fopen(full_filename, "r")){ Node* tree = NU

当我运行这个程序时,如果它运行正常,它会打印出“SUCCESS!!!!”,但是我不断地遇到seg故障,我似乎不知道在哪里。有人能帮我确定究竟是什么导致信号SIGABRT,以及最有可能导致分段错误的原因是什么

我的代码是用c写的

编辑: 在第97行的主代码中,我有函数fclose(fp),但我应该已经在另一个函数中通读了它。这是我在main.c中的代码:

FILE *fp = NULL;
if(fp = fopen(full_filename, "r")){
    Node* tree = NULL;
    tree = parser(fp);
    printTree(tree, 1);

    fclose(fp);
}
else
    printf("Error file DNE\n");

return 0;
函数解析器获取文件指针并将该文件指针发送到另一个名为scanner的函数。然后扫描器从该文件创建一个单词列表。然后解析器检查单词的语法

编辑2:
我在main中去掉了fclose(fp),当我在gdb中运行它时,没有出现任何错误。但是当我在没有gdb的情况下运行它时,我仍然得到一个seg错误。

没有太多信息,但是从跟踪来看,我猜您正在尝试使用
fclose()
iofclose()
关闭一个文件,而该文件可能不存在,或者它没有打开

结论

问题一定出在parser()函数中。它似乎正在改变您的文件指针并使其无效

解释

我之所以这样说,是因为除非指针有效,否则它无法输入您的
if(fp=fopen(full_filename,“r”)
语句,但当您尝试关闭它时,指针似乎无效

注意

唯一能够影响指针的行是显示以下内容的行:

tree = parser(fp);

请参加,学习提出好问题stackoverflow.com/help/how-to-ask,做一个回答。MCVE应包括各种样本输入(说明所有方面)和所需输出。如果您正在寻找有关调试代码的帮助,请参见根据gdb,问题在于文件
main.c
行号97。看起来它与无效指针有关。你能告诉我们密码吗?这样人们就可以帮助您删除图片并将文本作为文本发布。使用按钮进行此操作。检查格式化提示(您希望将整个被截断的部分格式化为代码块)。如果您的代码是C,则不要用其他语言标记您的问题。检查
解析器
,查看是否
fclose
-s作为参数传入的
fp
。只有一个地方(传统上,相同的代码块由
fopen
-ed-it)可以执行此操作。如果您在同一个
fp
上两次
fclose
(例如在
parser
中,然后再次在发布的代码中),并且没有任何干预
fopen
,您将调用未定义的行为。这是一个注释,而不是答案。我添加了有关程序功能的更多信息。但是我将文件指针发送到另一个函数并读取该文件。然后我关闭main中的文件指针。