如果main()没有返回int值会发生什么?

Utk*_*tav 21 c c++

我知道在C编译器中,该main()函数由_start()函数调用,该函数具有如下代码:

exit(main()); // return value of main is returned
Run Code Online (Sandbox Code Playgroud)

如何_start()工作的时候main()不返回int,例如,如果它的返回类型void,float或者其他什么东西?

Rob*_*edy 14

如果main没有返回int,那么你有一个格式错误的程序,并且行为未定义.任何事情都可能发生.您的程序可能会崩溃,或者它可能会运行,好像没有任何错误.

让我们假设main返回了除了之外的其他内容int,并且您的编译器和链接器允许编写程序.但是,来电者并不知道这一点.如果调用者希望int在EAX(英特尔)寄存器中返回返回值,那么它将读取它以确定返回值main.如果你的错误main存储了一个float值,那么它将被解释为一个值int.(这并不意味着它会被截断.这意味着构成浮点值布局的位将代替构成int.)如果你的错误main返回void,那么它没有在预期的寄存器中存储任何东西,所以调用者将获得之前存储在该寄存器中的任何值.

如果你main返回某种类型,它希望存储一个调用者没有为其保留内存的地方(例如一个大型结构),那么它最终将覆盖其他内容,这可能对程序的干净关闭很重要,导致你的程序崩溃了.

  • 如何在EAX中存储浮动? (3认同)

Kei*_*son 14

C标准从未提及过这个_start功能; 我不相信C++也会这样做.

在1999 ISO标准之前的C中,如果执行到达结束而main()没有执行return语句,或执行return未指定值的语句,则"返回到主机环境的终止状态未定义".在实践中,我已经看到这样的程序返回状态为1(失败)的实现,或者内存中的某些任意值,例如最后一个被调用函数的结果.

1999 ISO C标准改变了这一点:"到达},终止函数返回值0".这符合C++至少自1998年第一个ISO C++标准以来的规则.

(作为一种风格,我更喜欢return 0;在结尾处有一个明确的main,即使它不是严格要求的.这与int除了之外的功能一致main,并且它使得C99 C之前的编译器具有更好的可移植性.)

所有这些都假定main使用返回类型定义int.这是一个的具体由C标准(或者唯一支持的类型int main(void)int main(int argc, char *argv[])或等效物),但(托管)实现可支持其他实现定义的定义.C90标准没有明确涵盖这种情况,但C99说,"如果返回类型与int不兼容,则返回到主机环境的终止状态未指定."

C++标准有点不同.对于托管实现,main 必须定义为返回int.参数是实现定义的,但必须支持C的标准形式.

对于C或C++中的托管实现,我没有充分理由main使用其他类型的返回类型进行定义int.只需使用两个标准定义中的一个,就不会出现问题.

对于"独立实现","在程序启动时调用的函数的名称和类型是实现定义的".因此,入口点可能合法地返回void或其他东西,甚至可能不会被调用main.注意,"独立实现"是"其中C程序执行可以在没有操作系统的任何益处的情况下发生",通常是嵌入式系统.


Pup*_*ppy 8

该函数将返回实现定义的值.例如,在C++中,main隐式返回0.在这种void主要情况下,这将简单地返回_start.但是,几乎没有任何实现可以允许任何返回类型 - 它被烘焙到操作系统中,进程以整数值退出.


das*_*ght 7

在C++中这将是一个编译错误返回以外的任何其他int来自main():

error: ‘::main’ must return ‘int’
Run Code Online (Sandbox Code Playgroud)

在C中它是一个警告,你将得到一个浮动重新解释为int:例如,2.1F将被重新解释为224.