C语言main()主函数执行完毕后是否会再执行一段代码

分享到:
QQ空间
新浪微博
腾讯微博
豆瓣
人人网
main() 主函数执行完毕后,是否可能会再执行一段代码?给出说明。

main主函数是所有程序必须具备的函数,是C/C++人员一接触代码就知道的函数,那么这个问题会难倒很多人,尤其是平常不注意思考,不懂得问为什么的程序员,

这个问题的答案是:main() 函数结束后可以执行一些代码,进行清理工作。

具体请看下面的解析。

先来看一段代码:

复制纯文本复制

  1. #include <stdlib.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. void fnl(void), fn2(void), fn3(void), fn4(void);
  5. int main( void ){
  6. // atexit()函数原型为:int atexit(void (*function)(void));
  7. atexit(fnl);
  8. atexit(fn2);
  9. atexit(fn3);
  10. atexit(fn4);
  11. printf("This is executed first.\n");
  12. return 0;
  13. }
  14. void fnl(){ //main退出后执行的函数
  15. printf("next.\n");
  16. }
  17. void fn2(){
  18. printf("executed " );
  19. }
  20. void fn3(){
  21. printf("is ");
  22. }
  23. void fn4(){
  24. printf("This ");
  25. }
#include <stdlib.h>
#include <stdlib.h>
#include <stdio.h>void fnl(void), fn2(void), fn3(void), fn4(void);int main( void ){// atexit()函数原型为:int atexit(void (*function)(void));atexit(fnl);atexit(fn2);atexit(fn3);atexit(fn4);printf("This is executed first.\n");return 0;
}void fnl(){  //main退出后执行的函数printf("next.\n");
}void fn2(){printf("executed " );
}void fn3(){printf("is ");
}void fn4(){printf("This ");
}

运行结果:

This is executed first.
This is executed next.

看到没,fn1()、fn2()、fn3()、fn4()就是在main()函数运行结束后调用的。

这里最关键的是使用了 atexit() 函数,讲 atexit() 函数之前先讲一下 exit() 函数。

exit()函数用于在程序运行的过程中随时结束程序,其原型为:
    void exit(int state);
exit的参数state是返回给操作系统或当前程序的调用程序,返回0表示程序正常结束,非0表示程序非正常结束。main函数结束时也会隐式地调用exit()函数。exit()函数运行时首先会执行由atexit()函数登记的函数,然后会做一些自身的清理工作,同时刷新所有输出流、关闭所有打开的流并且关闭通过标准I/O函数tmpfile()创建的临时文件。

atexit() 用于注册终止函数(即main执行结束后调用的函数),其原型为:
    int atexit(void (*function)(void));
很多时候我们需要在程序退出的时候做一些诸如释放资源的操作,但程序退出的方式有很多种,比如main()函数运行结束、在程序的某个地方用exit()结束程序、用户通过Ctrl+C或Ctrl+break操作来终止程序等等,因此需要有一种与程序退出方式无关的方法来进行程序退出时的必要处理。方法就是用atexit()函数来注册程序正常终止时要被调用的函数。

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

在一个程序中最多可以用atexit()注册32个处理函数,这些处理函数的调用顺序与其注册的顺序相反,也即最先注册的最后调用,最后注册的最先调用。同一个函数如若登记多次,则也会被调用多次。

正如上面程序中所示,这些函数都是在main结束以后才被调用的。atexit()只是注册他们,使得他们在main结束以后被调用,看名字就可以看出来。

C语言main()主函数执行完毕后是否会再执行一段代码相关推荐

  1. 为什么SpringBoot中main方法执行完毕后程序不会直接退出呢

    科普:为什么SpringBoot中main方法执行完毕后程序不会直接退出呢 [转载]https://cloud.tencent.com/developer/article/1590215 针对这个问题 ...

  2. c语言历史以及main主函数的剖析

            语言是一种沟通工具,比如英语.汉语等等.而计算机语言是人和计算机交流的语言. c/c++/java/phthon 等等就是各种计算机语言,而 c 语言是计算机语言的一种,任何学计 算机 ...

  3. 程序是从main主函数开始运行吗?

       很多人开始学计算机语言,编写代码时都会有一个疑问:程序真的是从main主函数开始的吗?之前什么都不做吗?main结束后就不能执行其他函数了吗?下面本篇文章就为此问题做一个简单的解释.    操作 ...

  4. C语言algorithm主函数,C语言中主函数中相关有关问题?

    C语言中主函数中相关问题??? #include #include #include #include #include #include #include #include #include usi ...

  5. 异步执性两个线程,两个线程执行完毕后再进行其他操作

    如果想要快速高效地实现上述需求,可以考虑用队列组 dispatch_group_t group =  dispatch_group_create(); dispatch_group_async(gro ...

  6. Js先执行点击事件,再执行失去焦点事件的解决方法

    Js先执行点击事件,再执行失去焦点事件的解决方法 思路:给失去焦点事件设置一个暂停,让点击事件先执行. js代码: //点击事件 先执行 $(document.body).on('click','#e ...

  7. 易语言 多线程,等待所有线程执行完毕后操作

    用处: 当你请求网络,想吧网络请求的结果放到一个全局数组中,然后最后一块处理数组 线程调用案列: .版本 2 .支持库 EThread .支持库 spec.程序集 窗口程序集1.子程序 _按钮1_被单 ...

  8. main主函数参数解析

    默认的main函数参数 int main(int argc, char *argv[]) {// 主函数的代码逻辑return 0; } 其中,int 是主函数的返回值类型,主函数执行完后会返回一个整 ...

  9. c语言的主函数名是什么,c语言主函数名是什么?_后端开发

    python语言属于汇编语言吗?_后端开发 python语言不是汇编语言.python是高级语言.汇编语言是一种用于电子计算机.微处理器.微控制器或其他可编程器件的低级语言,亦称为符号语言. C语言主 ...

最新文章

  1. 实现word在线预览 有php的写法 也有插件似
  2. android drawerlayout 遮罩层白色,DrawerLayout放在Toolbar的下方导致NavigationView出现与状态栏等高的遮...
  3. java注释日志打印_java 日志文件打印
  4. JSON Pointer
  5. Atitit 图像处理之编程之类库调用的接口api cli gui ws rest attilax大总结.docx
  6. opencv3.4.x和opencv4.x中 cv2.findContours的不同 ValueError: too many values to unpack (expected 2)
  7. 使用ResourceHacker以命令行方式更新应用程序图标
  8. 【Visio】 windows Visio 画图
  9. Excel-事件(Workbook、Worksheet、Range、OnKey/OnTime)
  10. luogu3933 Chtholly Nota Seniorious
  11. 机器学习决策树的Sklearn的实现(隐形眼镜镜片决策树实现)
  12. Vue+el-tree,元素拖拽时出现禁用图标, 请看解决办法
  13. 焊接机器人VS传统焊接的优势
  14. 【NLP】5计数词向量底层代码编写和gensim word2vec库入门——斯坦福大学CS224n第一次课作业代码复现
  15. mysql数据存储过程添加数据_Mysql 存储过程 自动插入数据
  16. php怎么设计题库,PHPWeb程序设计答案
  17. HC-05蓝牙模块初始化及测试
  18. 感恩工作平台心得体会_感恩工作心得体会范文3篇
  19. 艾默生流量计基础知识
  20. SSM框架专题-MyBatis框架老杜版从零入门笔记(下)

热门文章

  1. 软件工程 敏捷的酒后问答
  2. 2019计算机开机号003期,2019年011期福彩中心开机号(附汇总)
  3. php 没有libmysql.dll,PHP5.3以上版本没有libmysql.dll,以及由此带来的困扰
  4. 列注释_【EXCEL检查问题】:如何快速检查并删除EXCEL中隐藏的工作表、行、列等信息...
  5. python request url编码_Python 爬虫 (requests) 发送中文编码的 HTTP POST 请求
  6. 2018年江苏省计算机小高考,江苏2018年小高考成绩查询系统网站入口:江苏省教育考试院...
  7. 经常被问到的十个 Java 面试题?你Get了吗?
  8. 求ax bx c 0的根c语言,关于求方程ax2+bx+c=0根的问题
  9. linux 的swap具体分析_Linux SWAP 深度解读
  10. python 取余_玩转Python源码(一) quot;%squot;与“%d”