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);}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1131827.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

80+组件全覆盖:Bit Platform——Blazor开发的全能工具包首选

在Blazor生态飞速发展的今天&#xff0c;开发者对组件库的需求早已超越单纯的UI呈现&#xff0c;转向“高性能、全场景、低门槛”的综合解决方案。而bitplatform作为专为Blazor打造的全能工具包&#xff0c;凭借80轻量高性能组件、跨平台适配能力与企业级特性集成&#xff0c;成…

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电脑无…

8 工位转盘螺丝机程序开发全记录

8工位转盘螺丝机程序&#xff0c;三菱PLC FX-3u 台达伺服/步进 &#xff0c;包括PLC程序&#xff0c;威纶通触摸屏程序&#xff0c;IO表&#xff0c;参数设置 1个步进电机&#xff0c;2台伺服台达B2系列&#xff0c;拧螺丝的伺服用转矩模式 大量三菱PLC&#xff0c;三菱伺服&am…

从TIOBE 2025年度语言到2026智能体生态:C#的二次崛起与范式革新

2026年初&#xff0c;TIOBE指数正式将C#授予2025年度编程语言称号&#xff0c;这是其三年内第二次获此殊荣&#xff0c;标志着这门曾被定义为"企业级传统语言"的编程语言&#xff0c;已完成向AI时代核心开发工具的华丽转型[__LINK_ICON]。从TIOBE榜单上的逆势增长到2…

deepseek_markdown_20260108_c5cec3

炒股八条铁律&#xff1a;从泥地里爬出的交易者分享 不管你现在是用五万还是五百万炒股&#xff0c;如果你决定把炒股当成你的终身事业&#xff0c;想在接下来这轮牛市当中实现换车换房&#xff0c;那你就要把我今天分享的八条铁律背得滚瓜烂熟&#xff0c;做到知行合一。 这八…

大厂成熟FOC电机控制代码:电动出行设备的超强引擎

成熟FOC电机控制代码 大公司成熟FOC电机控制图。 可用于电动自行车&#xff0c;滑板 车&#xff0c;电机FOC控制等。 大厂成熟方案&#xff0c;直接可用&#xff0c;不是一般的普通代码可比的。 代码基于Stm031&#xff0c;国产很多芯片可以通用。 批量稳定使用。 以下功能&…

基于极限学习机(ELM)的单变量时间序列数据预测

基于极限学习机(ELM)的单变量时间序列的数据预测 ELM matlab代码注&#xff1a;暂无Matlab版本要求 -- 推荐 2018B 版本及以上在数据预测领域&#xff0c;极限学习机&#xff08;ELM&#xff09;凭借其快速的学习速度和良好的泛化性能备受关注。今天咱就唠唠基于ELM的单变量时间…

推荐一个基于 C# 开发的摸鱼背单词好帮手 ToastFish

欢迎来到 Dotnet 工具箱&#xff01;在这里&#xff0c;你可以发现各种令人惊喜的开源项目&#xff01;摸鱼神器ToastFish 是一款使用 C# 开发的桌面软件&#xff0c;由 Uahh 开发。它是一款利用 Windows 通知栏 来帮助用户背单词的工具&#xff0c;特别适合在上班、上课等不方…

LFM脉冲串信号的模糊函数

MATLAB 用于计算并绘制线性调频&#xff08;LFM&#xff09;脉冲串信号的模糊函数图像。可以生成清晰的模糊函数图像。 MATLAB 代码 function lfm_ambg(taup, b, up_down)% 参数说明&#xff1a;% taup: 脉冲宽度 (s)% b: 信号带宽 (Hz)% up_down: 调频方向&#xff0c;1 表示上…

五大智能调味升降机品牌深度测评,解放厨房高柜,哪款才是空间魔法师?

纳米涂层太空铝机身承重20公斤纹丝不动&#xff0c;AI语音挥手即降&#xff0c;上移式同频结构让高处调料瓶触手可及&#xff0c;厨房收纳正经历一场静默的技术革命。高处橱柜取物&#xff0c;是许多家庭厨房的共同痛点。踮脚、搬凳、摸索&#xff0c;不仅费力还存在安全隐患。…

C# Socket 通信:异步、同步与断线重连

1、C#Socket异步、同步通信服务端、客户端源码&#xff1b; 2、断线重连&#xff08;服务端或客户端没有启动顺序要求&#xff0c;先开启的等待另一端连接&#xff09;&#xff1b;3、服务端支持同时连接多个客户端&#xff1b;4、阅读代码就明白通信道理&#xff0c;注释详细&…

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

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

排水管网水质监测系统:确保从源头到排放的全流程水质管控

随着城市化进程加快&#xff0c;排水管网的水质安全直接关系到公共卫生和生态平衡。排水管网水质监测系统通过实时采集、分析水体关键指标&#xff0c;为市政管理提供科学决策依据。这套集成了传感器技术、物联网传输和智能分析功能的系统&#xff0c;正在成为现代城市水务管理…

高性价比升降机品牌推荐,让厨房高处空间触手可及的智能解决方案

面对厨房高处橱柜&#xff0c;你是否也曾经历这些困扰&#xff1f;踮脚够不着、搬凳子太危险、柜子深处物品被遗忘……传统吊柜的空间利用率低&#xff0c;取放不便已成为现代厨房的普遍痛点。升降机&#xff08;又称升降拉篮&#xff09;的出现&#xff0c;彻底改变了这一局面…

P6KE160A单向 TVS瞬态抑制二极管:3000W工业级瞬态屏障,精准守护160V敏感电路

P6KE160A单向 TVS瞬态抑制二极管 二极管产品已经跟我们的生活有着密不可分的联系了&#xff0c; TVS瞬态抑制二极管&#xff0c;是一种高效能保护二极管&#xff0c;产品体积小、功率大、响应快等诸多优点&#xff0c;产品应用广泛 TVS瞬态抑制二极管P6KE160A&#xff0c;是一种…

STM32步进电机:S型与SpTA加减速控制算法探秘

STM32步进电机高效S型T梯形曲线SpTA加减速控制算法 提供基于STM32的步进电机电机S型曲线控制算法以及比较流行的SpTA算法.SpTA算法具有更好的自适应性&#xff0c;控制效果更佳&#xff0c;特别适合移植在CPLD\\\\FPGA中实现对多路&#xff08;有多少IO&#xff0c;就可以控制多…

电磁寻迹小车代码全解析:基于STM32C8T6主控

出电磁寻迹小车代码 主控stm32c8t6 提供原理图 pcb 一、引言 电磁寻迹小车在智能车竞赛等场景中有着广泛应用。以STM32C8T6为主控芯片来打造这样一辆小车&#xff0c;我们需要从硬件原理图、PCB设计以及代码实现等多个方面入手。今天就来和大家详细唠唠这其中的门道&#xff…

探秘产线MES系统的核心功能

产线MES系统 扫码追溯 PLC通信 数据库存储 标签打印在现代制造业的复杂产线中&#xff0c;MES&#xff08;制造执行系统&#xff09;宛如一位幕后的智慧指挥家&#xff0c;掌控着生产的方方面面。今天咱们就来深入聊聊产线MES系统里几个关键的功能模块&#xff1a;扫码追溯、PL…

非科班普通人如何转大模型相关岗位拿下大厂 offer

现在大模型的风口有多猛&#xff0c;不用我多说吧&#xff1f;相关岗位的 HC&#xff08;head count&#xff0c;岗位编制&#xff09;肉眼可见地比传统前后端要多&#xff0c;就算你面的是传统后端岗位&#xff0c;面试官也总会绕着弯子问你几个大模型的问题&#xff0c;考察你…

轮毂电机分布式驱动车辆状态估计:EKF 与 UKF 的实战

车辆状态估计&#xff0c;扩展卡尔曼滤波EKF&#xff0c;无迹卡尔曼滤波UKF车辆状态估计&#xff0c;扩展卡尔曼滤波EKF&#xff0c;无迹卡尔曼滤波UKF 角阶跃输入整车7自由度模型UKF状态估计模型附送EKF状态估计模型&#xff0c;针对于轮毂电机分布式驱动车辆&#xff0c;进行…