C 退出行为像返回吗? [复制]

Posted

技术标签:

【中文标题】C 退出行为像返回吗? [复制]【英文标题】:C is exit behaving like return? [duplicate] 【发布时间】:2019-10-07 22:56:39 【问题描述】:

在 c 代码中,返回和退出 main 行为相同?

int main (int argc , char* argv[])

    exit(2);

int main (int argc , char* argv[])

    return 2;

当两个代码都从另一个 c 调用时,它们都将返回 2 ?

【问题讨论】:

阅读 C 语言中的 exit()main() 可能会有所帮助(并为该站点添加书签)。 【参考方案1】:

main() 函数的情况下,调用exit() 或使用return 语句最终从主机环境中观察到相同的输出,它们都将执行控制返回给环境。

但是,如果是任何用户定义的函数:

使用return 语句只会将控制权返回给调用者函数 调用exit()会将控制权返回给宿主环境,之后如下 调用atexit函数注册的所有函数 所有带有未写入缓冲数据的打开流都被刷新,所有打开的流都被刷新 关闭,并删除由tmpfile 函数创建的所有文件。

【讨论】:

在一些不寻常但并非不可能的情况下,return n;exit(n); 之间的main() 存在细微差别。通常引用的一个是,如果您在执行returnexit() 之前未关闭的打开文件上使用setbuf()setvbuf(),并且如果您提供一个本地的数组作为缓冲区,然后如果您使用return 关闭文件,则缓冲区超出范围导致未定义的行为,而如果您调用exit(),则它保持定义状态。但是,这在实际程序中很少出现问题。【参考方案2】:

main 应该表现得好像在 exit() (exit(main(argc,argv))) 内部调用了它, 所以来自 main 的 return 应该基本上等同于 exit(retval),除了返回之后 从 main 开始,对 main 本地人的引用变得无效,而如果您调用 exit,它们仍然有效:

#include <stdlib.h>
#include <stdio.h>
int *addr;
void print_thru_ptr(void)

    printf("%d\n", *addr);

int main (int argc , char* argv[])

    int local=42;
    addr=&local;
    atexit(print_thru_ptr);
    if(1)
        exit(2); //will print 42
    else
        return 2; //would be undefined
    

【讨论】:

exit(main(argc, argv, envp)); :D 而且,事实上,在 Mac 上,main() 甚至还有第四个参数。

以上是关于C 退出行为像返回吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在 main 之前退出程序是明确定义的行为吗?

退出(0)和退出(1)是啥意思? [复制]

((void(*)(void))0)() 是退出函数吗? [复制]

使用 JFrame/Swing 实现 macOS 隐藏时退出行为

我无法退出Vim,我点击逃跑并尝试:q:x:qx [复制]

选择哪一个:退出还是返回? [复制]