news 2026/9/16 23:41:26

C语言里面的中断程序:“exit()”和“return返回”

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C语言里面的中断程序:“exit()”和“return返回”

完整示例代码在文章末尾,示例代码来自《C Primer Plus》第17章程序清单17.4(films3.c)的源代码。

films3.c代码中,出现了exit(EXIT_FAILURE)和return 0语句,下面是为什么初始化阶段用了exit(EXIT_FAILURE),而main函数末尾用了return 0的原因,并说明exit()return的区别。

为什么初始化阶段用exit(EXIT_FAILURE)

这段代码:

InitializeList(&movies);if(ListIsFull(&movies)){fprintf(stderr,"No memory available! Bye!\n");exit(EXIT_FAILURE);}

放在程序刚开始、链表刚初始化之后。它的目的是检测严重错误(内存不足)并立即终止程序

  • InitializeList()内部通常会尝试分配链表头节点的内存。
  • 如果分配失败(极少见,但理论上可能),链表会被标记为“满”(在本书的实现中,初始化失败时会把列表设为满状态来表示错误)。
  • 一旦发生这种情况,程序根本无法继续运行(后续所有添加电影的操作都会失败),所以直接终止程序是最合理的选择。
  • 使用exit(EXIT_FAILURE)可以立即结束整个程序,不需要再执行后面的输入、显示等代码。

这是一种防御性编程做法:尽早发现无法恢复的错误,就立刻停止,避免程序进入无效状态继续运行产生误导性结果。

为什么main函数末尾用return 0

return0;

这是程序正常结束时的标准写法,表示:

  • 一切顺利(用户输入完成,列表显示完毕,可选的清理也做了)。
  • 向操作系统返回状态码 0(惯例表示“成功”)。

这是最常规、最推荐的结束main函数的方式。

exit()return的区别

方面return(在main中)exit()
作用范围只从当前函数返回控制权。
main中返回相当于结束程序。
立即终止整个程序,不管当前在哪个函数(哪怕嵌套很深)。
执行位置只能在函数体内使用,返回到调用者。可以在程序任何地方调用(包括库函数、嵌套函数)。
清理行为mainreturn n;会:
1. 刷新标准I/O缓冲区
2. 调用atexit()注册的函数
3. 向OS返回 n
(与exit(n)效果几乎相同)
同样会:
1. 调用atexit()注册的函数
2. 刷新标准I/O缓冲区
3. 关闭打开的文件
4. 向OS返回状态码
主要差异更“局部”,强调“本函数正常结束”。
main中推荐使用。
更“全局”,强调“强制立即终止程序”。
常用于错误处理或深层函数中需要立刻退出整个程序的情况。
可移植性和习惯main中写return 0;是C标准推荐的正常结束方式。exit()来自<stdlib.h>,常用于异常情况。
exit(EXIT_SUCCESS)exit(EXIT_FAILURE)是标准宏。
从非 main 函数返回如果在其他函数里用return,只会返回到调用者,程序继续运行。无论在哪里调用exit(),程序都会立即结束。

总结区别的实际意义

  • 如果你在main中正常结束,用return 0;更清晰、符合习惯。
  • 如果在程序早期或深层函数发现无法恢复的致命错误,用exit(EXIT_FAILURE)可以立刻停止整个程序,避免继续执行无意义的代码。

在《C Primer Plus》这本书的例子中,这里用exit()是为了教学目的:展示如何处理内存分配失败这种严重错误,同时演示exit()的用法。如果把这部分改成return EXIT_FAILURE;,效果也几乎一样(因为在main中),但用exit()更突出“立即终止”的意图。

完整示例代码:

/* films3.c -- using an ADT-style linked list *//* compile with list.c */#include<stdio.h>#include<stdlib.h>/* prototype for exit() */#include"list.h"/* defines List, Item */voidshowmovies(Item item);intmain(void){List movies;Item temp;/* initialize */InitializeList(&movies);if(ListIsFull(&movies)){fprintf(stderr,"No memory available! Bye!\n");exit(EXIT_FAILURE);}/* gather and store information */puts("Enter first movie title:");while(gets(temp.title)!=NULL&&temp.title[0]!='\0'){puts("Enter your rating <0-10>:");scanf("%d",&temp.rating);while(getchar()!='\n')continue;if(AddItem(temp,&movies)==false){fprintf(stderr,"Problem allocating memory\n");break;}if(ListIsFull(&movies)){puts("The list is now full.");break;}puts("Enter next movie title (empty line to stop):");}/* display */if(ListIsEmpty(&movies))printf("No data entered. ");else{printf("Here is the movie list:\n");Traverse(&movies,showmovies);}printf("Bye!\n");EmptyTheList(&movies);/* optional cleanup in some editions */return0;}voidshowmovies(Item item){printf("Movie: %s Rating: %d\n",item.title,item.rating);}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/16 21:55:58

Soundflower终极指南:5步掌握Mac音频路由神器

Soundflower终极指南&#xff1a;5步掌握Mac音频路由神器 【免费下载链接】Soundflower MacOS system extension that allows applications to pass audio to other applications. 项目地址: https://gitcode.com/gh_mirrors/sou/Soundflower 还在为Mac系统音频无法自由…

作者头像 李华
网站建设 2026/9/9 14:40:01

Soundflower终极音频路由指南:免费实现专业级Mac音频管理

Soundflower终极音频路由指南&#xff1a;免费实现专业级Mac音频管理 【免费下载链接】Soundflower MacOS system extension that allows applications to pass audio to other applications. 项目地址: https://gitcode.com/gh_mirrors/sou/Soundflower 还在为Mac电脑无…

作者头像 李华
网站建设 2026/9/15 14:26:46

【 n8n解惑】如何在 n8n 里同时操作数据库和调用外部 API,完成混合计算?

在 n8n 中构建混合计算工作流&#xff1a;整合数据库与外部 API 赋能机器学习应用 目录 引言与背景原理解释10分钟快速上手代码实现与工程要点应用场景与案例实验设计与结果分析性能分析与技术对比消融研究与可解释性可靠性、安全与合规工程化与生产部署常见问题与解决方案创…

作者头像 李华
网站建设 2026/9/9 16:16:43

西门子S7 - 1200 + V90PN 通过FB284控制4个轴及KTP700触摸屏程序实战

西门子S7-1200V90PN 通过 FB284控制4个轴 包含KTP700触摸屏程序 调试通过 现场程序最近在现场完成了一个挺有意思的项目&#xff0c;用西门子S7 - 1200搭配V90PN&#xff0c;通过FB284功能块实现对4个轴的精准控制&#xff0c;还配套了KTP700触摸屏程序&#xff0c;目前整个系统…

作者头像 李华
网站建设 2026/9/9 14:39:18

Thinkphp的协同过滤算法的“银海”音乐歌曲推荐系统

目录协同过滤算法在ThinkPHP音乐推荐系统中的应用项目开发技术介绍PHP核心代码部分展示系统结论源码获取/同行可拿货,招校园代理协同过滤算法在ThinkPHP音乐推荐系统中的应用 银海音乐歌曲推荐系统基于ThinkPHP框架开发&#xff0c;采用协同过滤算法实现个性化推荐功能。系统通…

作者头像 李华
网站建设 2026/9/9 16:15:42

Thinkphp的线上订餐骑手配送管理系统的设计与实现

目录摘要关键词项目开发技术介绍PHP核心代码部分展示系统结论源码获取/同行可拿货,招校园代理摘要 随着互联网技术的快速发展&#xff0c;线上订餐系统已成为餐饮行业的重要组成部分。骑手配送作为线上订餐的核心环节&#xff0c;其管理效率直接影响用户体验和平台运营成本。基…

作者头像 李华