3
4

2 回答 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 回答