没有return关键字的main()函数返回值

main() 函数的返回值类型必须是 int ,这样返回值才能传递给程序的激活者表示程序正常退出。

int main(void) 不等同于 int main() ,后者并不代表参数为空,而是不可预料的参数。

return 是语言级的关键字,实现了调用堆栈的返回;return是返回数值并退出函数,如果是在主函数main(), return 返回一个int值,并结束当前进程,如果不是在main函数中,那就是退回上一层调用。在多个进程时,如果有时要检测上个进程是否正常退出,就要用到上个进程的返回值。

下面在Linux系统中查看一下程序的返回值,以下是程序代码:

int main(void)
{
    return 5;//这里返回5
}

通过gcc编译后运行 通过echo 显示 $? (代表上一个命令执行后的退出状态) 得到上一个程序运行后的返回值5。
接下来把代码改成:

int main(void)
{
    //这里没有使用return
}

通过gcc编译后运行 通过echo 显示 $? (代表上一个命令执行后的退出状态) 得到上一个程序运行后的返回值1。
接下来把代码改成:

int main(void)
{
    printf("Hello C\n");
}

通过gcc编译后运行 通过echo 显示 $? (代表上一个命令执行后的退出状态) 得到上一个程序运行后的返回值8。这里返回的是程序中printf()函数的返回值,下面的程序示例能更加
的有助理解这一机制:

#include <stdio.h>

int function0()
{
    return 102;
}

int main(void)
{
    function0();
}

通过gcc编译后运行 通过echo 显示 $? (代表上一个命令执行后的退出状态) 得到上一个程序运行后的返回值102。即main()函数调用的function0()函数返回值。

通过GDB调试上一个程序代码:

这里写图片描述

设置第五行为断点,运行到断点时输出所有的寄存器信息:

这里写图片描述

可以看到,在function0()函数未返回任何数值之前,eax寄存器的值为0x01,这就说明了为何一个空的main()函数会返回1了。
继续运行到main()函数末尾,输出所有的寄存器信息:

这里写图片描述

这时eax寄存器的值为0x66 ,即十进制的102,这就说明了为何一个没有return的main()函数会返回最后一个被调用函数的返回值了,因为main()函数没有return,所以eax寄存器的值仍为上一个函数更改后的内容。

码字很辛苦,转载请注明来自陈浩的CSDN博客 http://www.chenhao.info

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值