为什么每个C程序都需要一个叫做main的函数
2016-12-11 14:21
211 查看
当加载器运行时,它创建一个如下图的运行时存储器映像(存在一段较短的时间,在虚拟地址空间上)。在可执行文件中段头部表的指导下,加载器将可执行文件的的相关内容拷贝到代码和数据段,然后加载器跳转到程序的入口点,也就是符号_start的地址。在_start地址处的启动代码(startup code)是在目标文件ctr1.o(参考下面代码)中定义的,对所有C程序都是一样的。它会最终调用应用程序的main函数。除了一些头部信息,在加载过程中没有任何从磁盘到存储器的数据拷贝。直到CPU引用一个被映射的虚拟页才会进行拷贝,此时,操作系统利用它的页面调度机制自动将页面从磁盘传送到存储器。
有了上述的基础之后,我们很自然的可以回答题目中的问题,C的启动代码对于每个C程序都是相同的,要跳转到一个叫做main的函数上。
另外一个问题main函数要不要return的问题,如果以return结尾,那么控制传递给启动程序,该程序通过调用_exit再将控制返回给操作系统。如果用户省略了return,也会发生同样的事情,因为是本质是过程调用。如果main以调用exit终止,那么exit将通过调用_exit将控制返回给操作系统。
0x080480c0 <_start>: /* Entry point in .textca */ call __libc_init_first /* Start code in .text */ call _init /* Startup code in .init */ call atexit /* Startup code in .text */ call main /* Application main routine */ call _exit /* Returns control to OS */
有了上述的基础之后,我们很自然的可以回答题目中的问题,C的启动代码对于每个C程序都是相同的,要跳转到一个叫做main的函数上。
另外一个问题main函数要不要return的问题,如果以return结尾,那么控制传递给启动程序,该程序通过调用_exit再将控制返回给操作系统。如果用户省略了return,也会发生同样的事情,因为是本质是过程调用。如果main以调用exit终止,那么exit将通过调用_exit将控制返回给操作系统。
相关文章推荐
- 【转载】为什么每个C程序都需要一个叫做main的函数
- 为什么每个C程序都需要一个叫做main的函数?
- C++第六周任务5:解决用一个项目多个文件的方式实现,其中两个类的声明放在一个.h文件中,每个类的成员函数分别放一个文件,main()函数用一个文件。体会这样安排的优点。
- 调试使用了函数模块的程序时需要注意的一个小问题
- 写一个函数,输入一个二叉树,树中每个节点存放了一个整数值,函数返回这棵二叉树中相差最大的两个节点间的差值绝对值。请注意程序效率。
- 新手理解:为什么bio模式的server端每个client都需要对应一个线程
- 调试使用了函数模块的程序时需要注意的一个小问题
- 需要求3个长方体的体积,写一个基于对象的程序,数据成员包括 length width height 要求用成员函数实现以下功能
- 我刚写的一个反序输出每个英文单词的小程序,大神看下哪里需要调整
- 再以Circle类为直接基类,派生出一个Cylinder(圆柱体)类,再增加数据成员h(高),,以及求圆柱表面积的成员函数area和求圆柱体积的成员函数volume,实现需要的成员函数,并设计main
- 写一个函数,输入一个二叉树,树中每个节点存放了一个整数值,函数返回这棵二叉树中相差最大的两个节点间的差值绝对值。请注意程序效率。
- [阿里巴巴2015校园招聘]写一个函数,输入一个二叉树,树中每个节点存放了一个整数值,函数返回这棵二叉树中相差最大的两个节点间的差值绝对值。请注意程序效率。 .
- off() 方法 与 unbind() 方法移除绑定事件的处理程序。one()函数用于为每个匹配元素的一个或多个事件绑定一次性事件处理函数
- 编写一个程序,其main()调用一个用户定义的函数(以光年值为参数,并返回对应天文单位 的值).该程序按下面的格式要求用户输入光年值
- 一个班有n个学生,需要把每个学生的简单资料(姓名和学号)输入计算机保存。然后可以通过输入某一学生的姓名查找其有关资料。当输入一个姓名后程序就查找该班有无此学生,如果有,则输出他的姓名和学号,如果找不到
- 写一个程序,定义抽象基类Shape,由它派生出3个派生类,Circle(圆形)、Rectangle(矩形)、Triangle(三角形)。用如下的main()函数,求出定义的几个几何体的面积和
- 8.2 习题编写一个程序,在遇到EOF之前,把输入作为字符流读取,程序需要打印每个输入的字符及其相应的ASCLL十进制..........
- 8.9 编写函数打开文件用于输入,将文件内容读入 string 类型的 vector 容器,每一行存储为该容器对象 的一个元素。8.10 重写上面的程序,把文件中的每个单词存储为 容器的一个元素
- 4,在本章第2.6.2(题目错误)节中给出了包含类定义的头文件student.h,包含成员函数定义的源文件student.cpp以及包含主函数的源文件main.cpp。请完善该程序,在类中增加一个对数
- 为什么c++程序调用c编译器编译的函数需要在调用前加上extern“C”