C语言从头学25—— exit() 函数及 atexit() 函数

我们在 main 程序里通过 "return 0;" 这个语句来结束整个程序的运行,而在函数(也可以叫子程序)中使用 return 语句结束函数运行并带着返回值 (如有的话) 返回到调用者那里,然后继续运行后边的代码。如果在子程序那里就想结束整个程序的运行,用到的就是函数 exit()。

该函数的原型定义在头文件 stdlib.h 里面,如果包含stdio.h头文件使用exit函数报错,那就再把stdlib.h包含上。

exit() 函数用来终止整个程序的运行,执行到该函数程序就会立即结束。exit() 是有返回值的,返回值就是写在括号中的整型参数。说到程序都结束了,返回值还返给谁呢?它其实是返给操作系统的。

exit(0) 表示程序正常结束;exit(1)表示程序异常结束。

exit(0) 如果放到main函数中,起到的作用和return 0; 就是一样的了。

在C语言中还有一个和 exit 相关联的函数 atexit(),该函数的原型也是定义在头文件 stdlib.h当中。atexit() 函数是一个有参函数,它的参数是一个函数指针。

这里补充一下函数指针的概念:函数就是一段内存里面可重复使用的代码,C语言允许通过指针获取到这个函数再作为参数传入到其它函数中;也就是说函数也可以作为参数使用。函数指针概念很复杂,但使用起来很简单,函数名就是指向该函数的指针。我们把作为参数的函数名写到调用它的函数名后面括号内即可。

作为 atexit() 参数的函数是有要求的,必须是无参且无返回值的,一般它要完成的工作就是程序结束前的扫尾工作。

举个简单的例子作为说明:

cpp 复制代码
#include<stdio.h>
#include<stdlib.h>
void myAtExit1(void)
{
    printf("程序出现问题按任意键试试!\n");
    int a = getchar();
}
void myAtExit2(void)
{
    printf("程序出现问题按任意键后结束。。。\n");
    int b = getchar();
}
int main(void)
{
    atexit(myAtExit2);
    atexit(myAtExit1);
    exit(1);
    return 0;
}

//运行结果:

程序出现问题按任意键试试!

程序出现问题按任意键后结束。。。

分析隐运行结果中显示内容的顺序可以看出:是紧挨着 exit 函数的先执行,即先执行"atexit (myAtExit1);"、再执行"atexit(myAtExit2);";两行代码是倒序执行的,这是atexit函数的特点,因为计算机是先找到 exit 函数后再倒着找 atexit 函数执行。

相关推荐
智者知已应修善业9 分钟前
【51单片机单按键控制2个LED循环闪烁】2022-12-7
c语言·经验分享·笔记·嵌入式硬件·51单片机
笑口常开xpr34 分钟前
Linux动静态库开发基础:静态库与动态库的编译构建、链接使用及问题排查
linux·c语言·动态库·静态库
三体世界1 小时前
测试用例全解析:从入门到精通(1)
linux·c语言·c++·python·功能测试·测试用例·测试覆盖率
程序员东岸2 小时前
C语言入门指南:字符函数和字符串函数
c语言·笔记·学习·程序人生·算法
kyle~11 小时前
排序---插入排序(Insertion Sort)
c语言·数据结构·c++·算法·排序算法
张晓~1833994812112 小时前
短视频矩阵源码-视频剪辑+AI智能体开发接入技术分享
c语言·c++·人工智能·矩阵·c#·php·音视频
纵有疾風起13 小时前
数据结构中的排序秘籍:从基础到进阶的全面解析
c语言·数据结构·算法·排序算法
夜猫逐梦15 小时前
【Lua】Windows 下编写 C 扩展模块:VS 编译与 Lua 调用全流程
c语言·windows·lua
_OP_CHEN15 小时前
数据结构(C语言篇):(十三)堆的应用
c语言·数据结构·二叉树·学习笔记·堆排序··top-k问题
量子炒饭大师16 小时前
收集飞花令碎片——C语言关键字typedef
c语言·c++·算法