问问题
93 次
2 回答
6
这正是重点。
没有“void main()”。总是有一个结果值,如果你不返回一个并且在你的程序中不做任何事情,那么返回值就是程序启动时发生在适当寄存器中的值(或者具体来说,无论何时发生在main 是从启动代码中调用的)。这当然取决于程序在 main 之前正在做什么,例如处理共享库。
编辑:要了解这是如何发生的,请尝试以下操作:
int foo(void)
{
return 55;
}
void main(void)
{
foo();
}
当然,不能保证,但是这个程序的退出代码很有可能是 55,因为这是某个函数返回的最后一个值。想象一下调用发生在 main 之前。
于 2012-09-27T17:20:40.070 回答
2
进一步说明克里斯蒂安在说什么。即使您声明void main()
您的进程将返回之前的任何值eax
(因为您在 linux x86 架构上)。
void main() {
asm("movl $55, %eax");
}
所以现在它总是返回 55 b/c 以上代码显式初始化eax
。
$ cc rval.c
$ ./a.out
$ echo $?
55
同样,此示例仅适用于当前的主要操作系统,因为我假设调用约定。操作系统没有理由不能有不同的调用约定,并且返回值可能在其他地方(RAM、寄存器等)。
于 2012-09-27T18:39:57.863 回答