入口函数和程序初始化

程序起始地点

首先问大家一个问题:程序真的从main函数开始么?

#include<stdio.h>
#include<stdlib.h>

int a = 3;

int main()
{
   
	int *p = (int *)malloc(sizeof(int));
	scanf("%d", p);
	printf("%d",a + *p);
	free(p);
}

从代码中我们有一个疑惑?
在函数刚刚执行到main函数的时候,a的值就已经确定了。同时main函数的参数也正确的被传了进来。另外,堆栈以及一些系统io的初始化已经悄悄完成了。

而在c++中,要完成的事情更多:对象的构造

现在我们知道了:
操作系统装载程序之后,首先运行的代码并不是main函数的第一行,而是别的代码。
这些代码负责准备好main函数执行所需要的环境,并负责调用main函数

运行这些代码的函数称为入口函数入口点。

一个程序的运行步骤大致如下:

  1. 操作系统创建进城后,将控制权交到程序的入口
  2. 入口函数对运行库和程序运行环境进行初始化
  3. 入口函数完成初始化,调用main函数
  4. main函数执行完毕之后,返回到入口函数

程序结束地点

程序结束地点真的是main函数的return 0;么?

来看这段代码

void foo(void)
{
   
	cout<<"bye!"<<endl;
}

int main()
{
   
	atexit(&foo);	//2
	cout<<"endof main"<<endl;	//1
}

大家不妨猜一下这两个哪个先打印出来?

我们来看一下输出:

endof main
bye!

atexit是一个特殊的函数,接受一个函数指针作为参数,并保证在程序正常退出(从main里返回)时,这个函数指针指向的函数会被调用。

  • atexit函数详解(未完成)

参考文献

[1] 俞甲子 石凡 潘爱明.程序员的自我修养.电子工业出版社,2009.4.