免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123456
最近访问板块 发新帖
楼主: xumouxin1
打印 上一主题 下一主题

exit()和return 有什么区别? [复制链接]

论坛徽章:
0
51 [报告]
发表于 2006-12-07 17:29 |只看该作者
原帖由 tyc611 于 2006-12-7 16:56 发表

骷髅,我怎么没注意到过?
哪个版的?

上面说了嘛,是黑白头,不是黑白骷髅......黑白郎君?

论坛徽章:
0
52 [报告]
发表于 2006-12-08 09:27 |只看该作者
int fd;
        char buf[1024];
        int iSize;

        memset(buf,0x00,1204);

越界了,你的程序代码少,,用exit一般会没问题,但如果用return就会爆掉.

论坛徽章:
0
53 [报告]
发表于 2006-12-08 10:59 |只看该作者
原帖由 飞灰橙 于 2006-12-7 13:05 发表


是因为cast结果undefined吗? 好好想想。

那是因为啥?从抽象机的语义上,我找不到别的undefined的行为了。
函数调用约定一类的ABI的东西根本不该在考虑范围内吧?给点提示?

[ 本帖最后由 delimy 于 2006-12-8 11:01 编辑 ]

论坛徽章:
0
54 [报告]
发表于 2006-12-09 13:53 |只看该作者

!!!!!!!!!!!!!!!!!!!狂汗的那种~~~

char buf[1024];
memset(buf,0x00,1204);
1024, 1204,这样操作不越界有鬼啊~~~
-----------------------------------------
和return ,exit没有关系的啊,而且加-Wall, exit()有警告的,因为在kernel之后只有init这个进程可以使用exit,其他的程序都应该使用_exit()

论坛徽章:
0
55 [报告]
发表于 2006-12-09 14:30 |只看该作者
原帖由 飞灰橙 于 2006-12-5 11:30 发表
char buf[1024];
        int iSize;

        memset(buf,0x00,1204);
原帖由 isjfk 于 2006-12-5 15:53 发表

确实是有那么点不同,所以才有了 lz 的问题。


以下写给lz:
lz 的程序因为 memset() 范围写错破坏了 main() 函数的堆栈,return 无法返回调用 main() 的那个函数(我估计是返回到了 0 地址),所以出现段错误。而直接调用 exit() 不会有退出 main() 函数这一步,因此没有报错。
原帖由 isjfk 于 2006-12-6 12:10 发表
我觉得如果在 main() 里面堆栈溢出,那根本就没有回到 stub 的机会。因为 main 压在堆栈里面,用来返回 stub 的 IP 指针已经被破坏了
原帖由 vipzxl 于 2006-12-6 13:31 发表
int main()
{
        int fd;
        char buf[1024];
        int iSize;

        memset(buf,0x00,1204);
。。。。
注意:
程序里是1204,定义的数组长度为1024!
原帖由 renyee 于 2006-12-6 16:52 发表
char buf[1024];
        int iSize;

        memset(buf,0x00,1204);

把main函数的回调地址覆盖了,exit直接退出,掩盖了那个事实
原帖由 ivanleung 于 2006-12-8 09:27 发表
int fd;
        char buf[1024];
        int iSize;

        memset(buf,0x00,1204);

越界了,你的程序代码少,,用exit一般会没问题,但如果用return就会爆掉.
原帖由 yiciyuan 于 2006-12-9 13:53 发表
char buf[1024];
memset(buf,0x00,1204);
1024, 1204,这样操作不越界有鬼啊~~~
-----------------------------------------
和return ,exit没有关系的啊,而且加-Wall, exit()有警告的,因为在kernel之后只有 ...


呵呵,这就告诉我们,打键盘要准确些,速度是其次的了……

论坛徽章:
0
56 [报告]
发表于 2006-12-09 14:53 |只看该作者
1204, 1024, 不好的习惯,不用sizeof

论坛徽章:
0
57 [报告]
发表于 2006-12-09 23:04 |只看该作者
要包含stdlib.h头文件.

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
58 [报告]
发表于 2006-12-10 11:23 |只看该作者
原帖由 飞灰橙 于 2006-12-5 14:49 发表

C还是拿代码说话吧:
以下代码,在我的linux上测试,如果用exit (0), 会显示tom
用return 0, 会显示jerry
[code]
#include <stdio.h>
#include <stdlib.h>


int a, b;

void test ()
{ ...


高!橙子的代码非常非常之能说明问题呀!

论坛徽章:
0
59 [报告]
发表于 2006-12-10 11:41 |只看该作者
原帖由 pushmao 于 2006-12-5 16:37 发表
两者的区别简单点说就是,return返回到上层,exit是直接退出程序。



有道理,return不仅是Main,其它任何函数都有返回,但exit是退出进程了.差别当然有了.
不过上面的程序还是有问题,文件打开返回不仅是-1,还有其它条件没完全处理,这是不对的
也是不严谨的.

论坛徽章:
0
60 [报告]
发表于 2006-12-10 15:41 |只看该作者
return是同步的,exit不是
gcc有个标志表明某个函数是不回来的,我猜可能是优化的时候,下面的代码都可以不要了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP