Chinaunix首页 | 论坛 | 博客
  • 博客访问: 9112
  • 博文数量: 4
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 40
  • 用 户 组: 普通用户
  • 注册时间: 2015-04-27 16:50
文章分类
文章存档

2015年(4)

我的朋友

分类: LINUX

2015-04-27 17:14:34

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。
接下来把代码改成:

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

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

#include
 
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寄存器的值仍为上一个函数更改后的内容。



码字很辛苦,转载请注明来自陈浩的ChinaUnix博客

阅读(1203) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~