【问题标题】:What happens when a C programme is terminated without exit or abort function that means normally?当 C 程序在没有正常退出或中止函数的情况下终止时会发生什么?
【发布时间】:2021-07-25 01:01:17
【问题描述】:

据我们所知:-

exit() 执行以下操作。

  • 刷新未写入的缓冲数据。
  • 关闭所有打开的文件。
  • 删除临时文件。
  • 将整数退出状态返回给操作系统。

abort() 可能无法关闭打开的文件。它也可能不会删除 临时文件,并且可能不会刷新流缓冲区。此外,它不 调用用 atexit() 注册的函数。

来源:-https://www.geeksforgeeks.org/understanding-exit-abort-and-assert/

所以我的问题是当程序在没有这两个函数的情况下(通常)终止时会发生什么?

希望你有我的问题...

【问题讨论】:

    标签: c exit abort


    【解决方案1】:

    根据 C11 标准(嗯,another question 中链接的 n1570 草案),第 5.1.2.2.3 节程序终止声明行为未指定。

    引用 C11 草案:

    如果主函数的返回类型是兼容的类型 int,从初始调用返回到主函数是等价的 使用 main 返回的值调用 exit 函数 函数作为它的参数;11) 到达终止 main 的 } 函数返回值0。如果返回类型不兼容 带int,返回宿主环境的终止状态为 未指定。

    据我所知,这种行为在 C 语言诞生之初就一直如此。

    如果您曾经遇到过这种情况,最好将此情况视为需要修复的错误,除非您愿意深入研究编译器/工具链/框架指定的任何行为。

    【讨论】:

    • 我认为这是一个很好的答案。我认为回答问题的部分(正如我读到的那样)是“从对主函数的初始调用返回等同于调用退出函数......”返回与 int 不兼容的类型似乎不据我所知,与问题相关。
    • 我的看法是,一个 C 程序要么通过对 exit() 的调用、来自 main 的显式 return 调用而终止,要么它的控制流在没有显式调用的情况下从 main 下降到exit()return。我提供的参考资料解释了后一种情况,这是问题留下的唯一可能性..
    • 好的,但是您引用的标准文本说,删除 main 的末尾与返回 0 相同。这不是错误或未指定的行为。
    • @PaulHankin 你可能就在这里。与 ref 捆绑在一起的分号让我阅读了该段落,因为它都提到了对 exit() 的显式调用,导致我将其解释为任何不涉及显式返回或退出的内容都是未指定的。
    • 声称行为未指定是错误的。引用的第一句话精确地指定了行为。只有当main() 的返回类型与int 不兼容时,才会出现未指定的行为。报价很好。解释是错误的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 2021-10-10
    • 1970-01-01
    • 2011-03-13
    相关资源
    最近更新 更多