为什么main在这里不返回0



我正在看

ISO/IEC 9899:201x委员会草案- 2011年4月12日

,我发现在5.1.2.2.3程序终止

..reaching the } that terminates the main function returns a value of 0. 

表示如果在main()中没有指定任何返回语句,并且如果程序成功运行,那么main的右括号}将返回0。

但是在下面的代码中,我没有指定任何返回语句,但是它不返回0

#include<stdio.h>
int sum(int a,int b)
{
return (a + b);
}
int main()
{
    int a=10;
    int b=5;
    int ans;    
    ans=sum(a,b);
    printf("sum is %d",ans);
}

编译
gcc test.c  
./a.out
sum is 15
echo $?
9          // here it should be 0 but it shows 9 why?

该规则是在1999年版本的C标准中添加的。在C90中,返回的状态是undefined

可以通过将-std=c99传递给gcc来启用它。

作为旁注,有趣的是返回了9,因为它是printf的返回值,它只写了9个字符。

返回printf的返回值,即实际输出的字符数

函数的返回值通常存储在cpu的eax寄存器中,因此语句"return 4;"通常编译为

mov eax, 4;
ret;

和返回x(取决于你的编译器)类似于:

mov eax, [ebp + 4];
ret;

如果你没有指定一个返回值,那么编译器仍然会输出"ret",但不会改变eax的值。所以调用者会认为之前留在eax寄存器中的是返回值。对于这个例子,它通常是返回值printf,但是不同的编译器会生成不同的机器码,并且使用不同的寄存器。

这是一个简化的解释,不同的调用约定和目标平台将发挥至关重要的作用,但它应该足够的信息来解释在你的例子中"幕后"发生了什么。

如果你对汇编有基本的了解,比较不同编译器的反汇编是值得的。您可能会发现一些编译器正在清除eax寄存器作为保护。

相关内容

  • 没有找到相关文章

最新更新