该程序如何在最后一行(返回0;)后崩溃?
问题描述:
我有一个程序,分为多个文件,并包含很多包含数组,指针,结构和不包含的代码。该程序如何在最后一行(返回0;)后崩溃?
为了说明问题:这些是我的main()
方法的最后一行;
...
printf("\nLast line!");
return 0;
}
我编这个程序没有警告后,我执行它,在我的控制台我得到的文本:Last line!
在我的CMD和程序崩溃(不响应)之后。
我经常使用printf()
来调试我的代码,并确定程序崩溃的代码行。在这种情况下,我无法将我的头围绕在程序最后一行之后程序崩溃的事实中。
我的问题:
- 可在主要功能
return 0;
导致崩溃? - 是否有可能由于我的程序中的早先未定义的行为而导致程序崩溃?
- 如果是这样,我该如何调试我的代码? (我使用的是Windows 7)
注:我知道肯定只有一个printf("\nLast line!");
在我的代码。
答
可能
return 0;
在main()
函数导致崩溃?
至于单独的声明,不,这不会造成崩溃。
是否有可能由于在我的程序中的未定义的行为程序崩溃?
是的。最可能的是这样。您在代码早些时候在某处调用了undefined behaviour,如您所知,结果未定义。
如果是这样,我该如何调试我的代码?
尝试通过调试器和内存检查运行您的程序,如gdb
在Linux和Valgrind的。此外,还可以在代码中添加断点棘手的区域,并在检查实际值与期望值时检查调试器。很可能,您将能够发现错误。
答
而且停止使用printf();
试好调试器像(gdb
)它更简单,更快速地调试C代码
“_And是有可能的程序崩溃是由于早期在我的计划不确定的行为_?” - - **是**。谷歌“返回statement_中的_segmentation错误”,你会发现很多结果。 –
@CoolGuy好的,所以现在我必须找到它:) – moffeltje
唉:“编译这个程序没有警告”只意味着你的程序不包含语法错误。逻辑错误,例如覆盖您不拥有或被零除的内存,不会导致编译器警告或错误。 – usr2564301