main函数代表进程的主线程。程序开始执行时,系统为程序创建一个进程,main函数其实并不是首先被调用的函数,而是操作系统调用了C/C++运行期启动函数,该函数负责对C/C++ 运行期库进行初始化。它还能够保证已经声明了的任何全局对象和静态对象能够在代码执行之前正确的创建。

完成这些工作之后,就调用进入点函数(控制台程序为main函数),并在main函数里面执行一系列操作。

在main函数执行完毕后,从mian函数返回,启动函数调用C运行期的exit()函数,将返回值传递给它。其中在exit()会调用ExitProcess()函数,结束进程。

在程序退出的时候常需要做一些诸如释放资源的操作,但程序退出的方式有很多种,例如main()函数运行结束、在程序的某个地方用exit()结束程序、用户通过Ctrl+C等操作发信号来终止程序等,因此需要一种与程序退出方式无关的方法来进行程序退出时的必要处理。atexit()函数用来注册程序正常终止时要被调用的函数。(异常终止不被调用,例如收到信号)

atexit()函数的参数是一个函数指针,函数指针指向一个没有参数也没有返回值的函数。atexit()的函数原型如下:

int atexit(void(*)(void));

在一个程序中最多可以用atexit()注册32个处理函数,这些处理函数的调用顺序与其注册的顺序相反,即最先注册的最后调用,最后注册的最先调用。

#include<stdio.h>
#include<stdlib.h> void fn1()
{
printf("calling fn1()....\n");
} void fn2()
{
printf("calling fn2()....\n");
} int main()
{
atexit(fn1); //使用 atexit 注册fn1() 函数
atexit(fn2); //使用 atexit 注册fn2() 函数
printf("main exit...\n");
return 0;
}

运行结果:

main exit...
calling fn2()....
calling fn1()....

说明可以用atexit()函数来注册程序正常终止时要被调用的函数,并且在main()函数结束时调用这些函数的顺序与注册它们的顺序相反

最新文章

  1. JS 深浅拷贝
  2. HUAS_ACM 个人训练#4
  3. Android 源码下载方法(Git 方式clone)
  4. AOP是什么?
  5. 点击按钮对两个div的隐藏与显示进行切换
  6. JAVA线程锁lock下Condition的使用
  7. CODEVS1533 互斥的数(哈希表)
  8. 《Java数据结构与算法》笔记-CH4-3用栈实现分隔符匹配
  9. C++容器类的简介
  10. edit编辑框相关
  11. 初探HTML
  12. (转载)JS中的prototype
  13. 使用U盘在Mac机上装win8.1系统
  14. 字符串的拼接python
  15. 201521123103 《Java学习笔记》 第四周学习总结
  16. 配置Asp.Net Web项目NLog配置文件的位置
  17. git知识总结-1.git基础之git分布式
  18. [Swift]LeetCode421. 数组中两个数的最大异或值 | Maximum XOR of Two Numbers in an Array
  19. mongodb和python交互
  20. ADB抓取内存命令

热门文章

  1. [LeetCode] Detect Capital 检测大写格式
  2. 【JAVA】pdf转图片
  3. Efficient&amp;Elegant:Java程序员入门Cpp
  4. Shell自学二(参数传递和数组)
  5. [BZOJ 2144]跳跳棋
  6. [BZOJ 3332]旧试题
  7. VK Cup 2017 - Round 1
  8. APIO 2014
  9. [bzoj4883][Lydsy2017年5月月赛]棋盘上的守卫
  10. [Noi2013]书法家