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