有人能帮我确定C中Seg故障的原因和gdb输出的含义吗?
当我运行这个程序时,如果它运行正常,它会打印出“SUCCESS!!!!”,但是我不断地遇到seg故障,我似乎不知道在哪里。有人能帮我确定究竟是什么导致信号SIGABRT,以及最有可能导致分段错误的原因是什么 我的代码是用c写的 编辑: 在第97行的主代码中,我有函数fclose(fp),但我应该已经在另一个函数中通读了它。这是我在main.c中的代码:有人能帮我确定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
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中的文件指针。