程序是从main主函数开始运行吗?
来源:互联网 发布:安装双系统win7和linux 编辑:程序博客网 时间:2024/05/17 01:23
很多人开始学计算机语言,编写代码时都会有一个疑问:程序真的是从main主函数开始的吗?之前什么都不做吗?main结束后就不能执行其他函数了吗?下面本篇文章就为此问题做一个简单的解释。
操作系统在装载程序之后,首先运行的不是main程序的第一行,在执行mian主函数之前其实还有一些别的代码需要执行,这些代码负责准备main主函数执行所需要的一些环境,并且负责调用main主函数,在main函数返回后,会记录main函数的返回值,调用atexit()函数,然后结束进程。运行这些代码的函数称为入口函数或入口点,一个程序的入口点实际上是一个程序的初始化和结束部分,一个典型的程序运行步骤大致如下:
1、操作系统在创建进程后,把控制权交给了程序的入口,这个入口就是运行库中的某个入口函数。
2、入口函数对运行库和程序运行环境作初始化,包括堆,线程全局变量的构造。
3、入口函数在完成初始化之后,调用main()开始执行
4、main函数执行完成后返回到入口函数,然后入口函数进行清理工作,然后进行系统调用结束进程。
1、下面举例一个代码:
#include<stdio.h>
int a=3;
int main(int argc,char* argv[])
{
printf("hello world");
return 0;
}
例如上面那个程序,在main函数第一行执行之前全局变量的初始化已经完成了,main函数参数也传了进来
2、atexit函数也是在main函数返回后调用
atexit()注册的函数类型应为不接受任何参数的void函数,exit调用这些注册函数的顺序与它们 登记时候的顺序相反。同一个函数如若登记多次,则也会被调用多次。如果一个进程被信号所中断,那由atexit()函数注册的终止处理程序不会被调用.
程序例:
#include <stdio.h>
#include <stdlib.h>
void exit_fn1(void)
{
printf("Exit function #1 called\n");
}
void exit_fn2(void)
{
printf("Exit function #2 called\n");
}
int main(void)
{
/* post exit function #1 */
atexit(exit_fn1);
/* post exit function #2 */
atexit(exit_fn2);
return 0;
}
输出:
Exit function #2 called
Exit function #1 called
main主函数的参数:
Int main(int argc , char *argv[],char* envp[])
传参个数 参数列表 环境变量
主函数默认接收一个参数:就是所执行的命令,所传参数以空格键区分,若要传字符串可以用双引号和转义字符连接
文章材料来源于《程序员的自我修养》
此博客部分内容 http://www.cnblogs.com/wanghetao/archive/2012/04/03/2431256.html
阅读全文
0 0
- 程序是从main主函数开始运行吗?
- 程序真的是从main开始的吗?
- c语言程序总是从main函数开始执行吗?
- c程序从main函数开始执行?
- 程序是从main开始执行,最后main返回就结束了吗?
- main()是程序运行的第一个函数吗?
- main()是程序运行的第一个函数吗?
- linux c/c++程序是否都是从main函数开始?
- 读“为什么c程序要从main函数开始执行”
- c 程序必须要从main函数开始执行么?
- iOS 从main函数开始
- 1 从mysqld的main()函数开始
- 从Main函数开始认识cRtmpServer (2)
- C++01、从main函数开始
- 为什么c语言从main函数开始
- 从main函数开始学习kotlin
- nginx源码剖析--从main函数开始
- main 函数是怎样运行的
- hibernate分页机制包含scanner手动输入页码数
- Unity3d鼠标经过物体时变颜色,离开时恢复
- Java9学习(1):Java9安装与开发工具选择
- Docker常用命令原理图
- vs2013调用ffmpeg(不可调试)
- 程序是从main主函数开始运行吗?
- 源码分析RocketMQ之消息消费
- Decode String
- 线程同步 synchronized关键字使用
- accounting assistant
- nullptr关键字
- hdu5692 Snacks(线段树+dfs序)
- js所能表示的最大整数的问题
- spark自定义累加器