main函数执行完毕后还能继续执行代码

xidianxiancai 2009-08-21 08:59:48

//这段程序为什么在main函数执行完毕后,还能再执行一段代码?原因何在?
#include <stdio.h>
#include <stdlib.h>
int atexit(void (*function)(void));
void fn1(void), fn2(void), fn3(void), fn4(void);
int main()
{
atexit(fn1);
atexit(fn2);
atexit(fn3);
atexit(fn4);
printf("This is executed first.\n");
return 0;
}

void fn1()
{
printf("next.\n");
}

void fn2()
{
printf("executed ");
}

void fn3()
{
printf("is ");
}

void fn4()
{
printf("This ");
}
...全文
662 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
ww884203 2011-03-13
  • 打赏
  • 举报
回复
学习了,都不知道有这个东东。。
caad3 2011-03-13
  • 打赏
  • 举报
回复
http://blog.csdn.net/huhaihong/archive/2008/03/16/2189709.aspx
某某9 2011-03-13
  • 打赏
  • 举报
回复
功 能: 注册终止函数(即main执行结束后调用的函数)
用 法: int atexit(atexit_t func);
注意:atexit()注册的函数类型应为不接受任何参数的void函数,exit调用这些注册函数的顺序与它们 登记时候的顺序相反。
某某9 2011-03-13
  • 打赏
  • 举报
回复
atexit是注册一个终止函数。
skyworth98 2011-03-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 supermegaboy 的回复:]
atexit可以登记最多32个函数,当执行exit函数的时候可以按LIFO的顺序执行这些函数,main结束的时候是执行exit进行清理的。

实际上这个过程算不上main执行完毕后还能执行代码,因为exit的过程仍处于main结束的过程中。
[/Quote]

这个……
main已经返回了,所有的事情已经跟main没有关系了,atexit注册的函数由c/c++ runtime调用
eijikayn 2009-08-22
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 yueyucanyang 的回复:]
atexit是注册后进先出的函数,和函数入栈出栈是一样的。
在这里注册了四个函数,理解为入栈的顺序为fn1() -> fn2() -> fn3() -> fn4();出栈的顺序正好相反,而什么时候出栈呢?就是在调用函数结束时,准确的说应该是函数调用的最后的操作就是出栈过程。main()同样也是一个函数,在结束时,按出栈的顺序调用四个函数,即为fn4() -> fn3() -> fn2() -> fn1();
注册这个函数的目的就是为了在函数退出时调用的,即使是main()函数也是这样的。可以在这些函数中加入一些清理工作,比如内存释放等等。
[/Quote]
一般这个函数是在退时关闭一些会造成泄漏的东西,比如文件句柄,数据库,内存释放等等
xempo 2009-08-22
  • 打赏
  • 举报
回复
没有特殊用途,因为都可以用一般代码代替。
有不同意见的吗?
niimp2 2009-08-22
  • 打赏
  • 举报
回复
顶~
chenee543216 2009-08-21
  • 打赏
  • 举报
回复
(gdb)
This is executed first.
(gdb)
(gdb)
0xb7de3775 in __libc_start_main () from /lib/tls/i686/cmov/libc.so.6
(gdb) bt
#0 0xb7de3775 in __libc_start_main () from /lib/tls/i686/cmov/libc.so.6
#1 0x080483b1 in _start () at ../sysdeps/i386/elf/start.S:119
(gdb) disassemble $eip $eip+5
Dump of assembler code from 0xb7de3775 to 0xb7de377a:
0xb7de3775 <__libc_start_main+229>: mov %eax,(%esp)
0xb7de3778 <__libc_start_main+232>: call 0xb7dfbb30 <exit>
End of assembler dump.



呵呵,学习了,atexit()
以前没有用过,简单分析一下。程序从main()出来后,返回调用函数__libc_start_main ()-->__start();见堆栈
在main()执行完毕后紧接着会执行exit(),我估计atexit()只是把你的代码挂到exit()中去而已。
Rogice 2009-08-21
  • 打赏
  • 举报
回复
受教了~~~~~~~~~~~~~~
pengzhixi 2009-08-21
  • 打赏
  • 举报
回复
实际上应该就是在main函数里面调用了其他函数.所以这应该不是在main函数结束后执行的.
amasor1 2009-08-21
  • 打赏
  • 举报
回复
学习!!
Victor_Dinho 2009-08-21
  • 打赏
  • 举报
回复
原来还可以这样,学习了~~~
FJDHT444 2009-08-21
  • 打赏
  • 举报
回复
学习了,atexit!!
kakashi0309 2009-08-21
  • 打赏
  • 举报
回复
main结束 不代表整个进程结束
whg01 2009-08-21
  • 打赏
  • 举报
回复
操作系统提供的功能,main函数退出不代表进程结束,进程结束前,操作系统还会做一些事情。
highball 2009-08-21
  • 打赏
  • 举报
回复
mark 学习一下atexit
wuyu637 2009-08-21
  • 打赏
  • 举报
回复
atexit本来的作用就是注册一个终止函数。


你要知道,main本身对于编译器来说,只是一个函数,所有也要有压栈和出栈之说,main结束以后,不代表调用过程完全结束,只有退栈了,调用过程才是结束的。


而在退栈之前,编译器可以允许用户添加终止函数,就是你所看到的。
飞天御剑流 2009-08-21
  • 打赏
  • 举报
回复
atexit可以登记最多32个函数,当执行exit函数的时候可以按LIFO的顺序执行这些函数,main结束的时候是执行exit进行清理的。

实际上这个过程算不上main执行完毕后还能执行代码,因为exit的过程仍处于main结束的过程中。
jinwei1984 2009-08-21
  • 打赏
  • 举报
回复
学习!
加载更多回复(2)

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧