关于C语言main函数执行前后

之前几次的面试经历中好几次面试官都问过程序运行时在main函数之前发生了些什么。 笔者大概知道是做一些初始化相关的事情,今日详细mark一下。
main函数执行之前,主要就是初始化系统相关资源:
1.设置栈指针
2.初始化static静态和global全局变量,即data段的内容
3.将未初始化部分的赋初值:数值型short,int,long等为0,bool为FALSE,指针为NULL,等等,即.bss段的内容
4.运行全局构造器,估计是C++中构造函数之类的吧
5.将main函数的参数,argc,argv等传递给main函数,然后才真正运行main函数
同样地,main函数结束之后就是一些资源释放的事情,以及调用之前注册的终止处理程序等等。
附上一段apue上注册终止程序的demo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include "apue.h"
static void my_exit1(void);
static void my_exit2(void);
int main(void)
{
if(atexit(my_exit2) != 0){
err_sys("can't register my_exit2");
}

if(atexit(my_exit1) != 0){
err_sys("can't register my_exit1");
}

if(atexit(my_exit1) != 0){
err_sys("can't register my_exit1");
}

printf("main is done\n");
return 0;
}

static void my_exit1(void)
{
printf("first exit handler\n");
}

static void my_exit2(void)
{
printf("second exit handler\n");
}