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()
存在细微差别。通常引用的一个是,如果您在执行return
或exit()
之前未关闭的打开文件上使用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 退出行为像返回吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
((void(*)(void))0)() 是退出函数吗? [复制]