C 在最后一行(返回0;)后,此程序如何崩溃?

C 在最后一行(返回0;)后,此程序如何崩溃?,c,segmentation-fault,C,Segmentation Fault,我有一个程序,分为多个文件,有很多代码包含数组、指针、结构等等 说到这里:这是我的main()方法的最后几行 。。。 printf(“\n最后一行!”); 返回0; } 在我编译了这个没有警告的程序之后,我执行了它,在我的控制台中我得到了文本:最后一行在我的命令中,然后程序崩溃(不响应) 我经常使用printf()调试代码,并确定程序崩溃的代码行。在这种情况下,我无法理解程序在最后一行代码之后崩溃的事实 我的问题是: 不能返回0是否导致崩溃 是否有可能由于我的程序早期未定义的行为而导致程序崩

我有一个程序,分为多个文件,有很多代码包含数组、指针、结构等等

说到这里:这是我的
main()
方法的最后几行

。。。
printf(“\n最后一行!”);
返回0;
}
在我编译了这个没有警告的程序之后,我执行了它,在我的控制台中我得到了文本:
最后一行在我的命令中,然后程序崩溃(不响应)

我经常使用
printf()
调试代码,并确定程序崩溃的代码行。在这种情况下,我无法理解程序在最后一行代码之后崩溃的事实

我的问题是:

  • 不能
    返回0是否导致崩溃
  • 是否有可能由于我的程序早期未定义的行为而导致程序崩溃?
    • 如果是,我如何调试我的代码?(我正在使用Windows 7)
注意:我确信只有一个
printf(“\n最后一行!”)在我的代码中

不能
返回0main()
函数中的code>是否会导致崩溃

单就声明而言,不,它不会导致崩溃

有没有可能是由于我的程序早期未定义的行为导致程序崩溃

对。很可能是这样。您在代码前面的某个地方调用了它,并且正如您所知,结果是未定义的

如果是,我如何调试我的代码

尝试通过调试器和内存检查器运行程序,如linux和valgrind上的
gdb
。此外,您还可以在代码中的棘手区域添加断点,并在检查实际值与预期值的同时逐步完成调试器。最有可能的是,您将能够发现错误

不能
返回0main()
函数中的code>是否会导致崩溃

单就声明而言,不,它不会导致崩溃

有没有可能是由于我的程序早期未定义的行为导致程序崩溃

对。很可能是这样。您在代码前面的某个地方调用了它,并且正如您所知,结果是未定义的

如果是,我如何调试我的代码


尝试通过调试器和内存检查器运行程序,如linux和valgrind上的
gdb
。此外,您还可以在代码中的棘手区域添加断点,并在检查实际值与预期值的同时逐步完成调试器。最有可能的是,您将能够发现错误

也停止使用
printf()尝试一个好的调试器,比如(
gdb
)调试C代码更简单、更快速

同时停止使用
printf()尝试一个好的调试器,比如(
gdb
)调试C代码更简单、更快速。

“还有可能是我的程序早期的未定义行为导致程序崩溃吗?”--是的。谷歌“返回语句中的分段错误”,你会在这上面找到很多结果。@CoolGuy好的,所以现在我必须找到它:)唉:“编译这个程序时没有警告”只意味着你的程序不包含语法错误。逻辑错误,如覆盖您不拥有的内存或除以零,不会导致编译器警告或错误。当您说“在此之后程序崩溃(不响应)”是什么意思?它是崩溃了,还是只是“没有反应”?“不回应”是什么意思?当您从main()返回时,您希望它做什么?好的,那么您破坏了堆栈并吹走了main()返回地址?“是否有可能由于我的程序前面未定义的行为而导致程序崩溃?”--是的。谷歌“返回语句中的分段错误”,你会在这上面找到很多结果。@CoolGuy好的,所以现在我必须找到它:)唉:“编译这个程序时没有警告”只意味着你的程序不包含语法错误。逻辑错误,如覆盖您不拥有的内存或除以零,不会导致编译器警告或错误。当您说“在此之后程序崩溃(不响应)”是什么意思?它是崩溃了,还是只是“没有反应”?“不回应”是什么意思?当您从main()返回时,您希望它做什么?好的,那么您破坏了堆栈并吹走了main()返回地址?