标题:[原创]深入讲解main()返回值问题
只看楼主
栖柏
Rank: 2
等 级:论坛游民
威 望:3
帖 子:1103
专家分:17
注 册:2007-8-23
得分:0 
以下是引用编程高手在2007-10-3 2:10:00的发言:
LZ分明是不懂装懂嘛,错漏百出,还说那么多好像和似乎之类的词,明显就是滥竽充数
还有楼上,这么简单的问题怎么问得出来啊,如果会自动转那还写int main干嘛?动动脑子都想得到啊

能有能的理由,不能有不能的理由,理由是我想知道在这中间操作系统做了什么?编译器做了什么,难道你知道...就请说说吧


You have lots more to work on! Never give up!c language!
2007-10-03 12:18
冰的热度
Rank: 2
等 级:禁止访问
威 望:5
帖 子:404
专家分:0
注 册:2006-12-2
得分:0 
请读者注意我的用词,特别是红字,

如果读者想得到一个权威的完美的答案,肯定会令大家失望,我还没到那个境界,

另外,我是单纯从语言的角度分析的,没有结合操作系统来讲


科学是永恒之迷...... 我的博客http://blog..cn/u/1267727974 阅读我的blog,懂与不懂都是收获!
2007-10-03 21:19
冰的热度
Rank: 2
等 级:禁止访问
威 望:5
帖 子:404
专家分:0
注 册:2006-12-2
得分:0 
回复:(编程高手)LZ分明是不懂装懂嘛,错漏百出,还...
1.有句话说的好呀,"不怕你想错,就怕不去想"

2.请告诉我,到底 LZ 是谁呀! 或是什么意思呀?

科学是永恒之迷...... 我的博客http://blog..cn/u/1267727974 阅读我的blog,懂与不懂都是收获!
2007-10-03 21:25
缘吇弹
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:地球
等 级:版主
威 望:43
帖 子:3038
专家分:27
注 册:2007-7-2
得分:0 
以下是引用秀才在2007-10-1 17:41:52的发言:


用户的命令由command执行,首先command把程序加入内存,然后设置CPU的CS:IP指向程序的第一条指令(也就是程序入口,在C++中就是main()函数),从而使程序得以运行.程序结束后,返回到command中,CPU继续运行command.注意在返回的时候要有一个返回值,这样才能安全退出程序(注意我用的是退出一词),之后各寄存器会有恢复动作,如果没有返回值,虽然表面上看程序也正常结束了,但实际上它并没有退出,各寄存器并没有恢复,如CS:IP 还是指向程序尾部,如果得到CS:IP,那么可以让程序继续执行下去,但是所执行的程序已经不是你的代码所在的那段内存空间了,它在执行其它内存中的程序.


你听谁说应用程序加载是直接进入main()函数的?你以为编译器那么笨你不写return函数,函数执行完后就不会退栈返回?你写一个void function(void)函数然后让main调用,该函数不写return你看能不能返回到main中。建议你去买本谭老的c语言入门教材从头学起。

不知你有没有念过本科,学没学一点操作系统原理的课,知不知道什么是进程。你喜欢谈shell我就跟你讨论下shell,下面是个简单的shell的实现:

程序代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>
#include <unistd.h>
#define MAXLINE 256

int main(void)
{
char buf[MAXLINE];
pid_t pid;
int status;

printf(\"%%\"); //pintf prompt
while(fgets(buf,MAXLINE,stdin)!=NULL){
if(buf[strlen(buf)-1]=='\n')
buf[strlen(buf)-1]==0; //replace newline with null

if((pid=fork())<0){
printf(\"fork error\n\");
exit(1);
}
else if(pid==0){ //child process
execlp(buf,buf,(char*)0);
printf(\"couldn't execute: %s\",buf);
exit(127);
}

if((pid=waitpid(pid,&status,0))<0){ //child process
printf(\"waitpid error\");
exit(1);
}

printf(\"%%\");
}
}


fork函数创建子进程,子进程调用exec函数簇的一个(这里是execlp)执行另一个程序,执行到exec时该进程用新的程序替换旧的程序,新的程序再从main开始执行,exec的作用就是用新的程序替换当前进程的正文,数据,堆和栈。

如果你想在windows系统中实现,做一个command.com或cmd.exe,只需要把fork换成CreateProcess,execlp对应的是ShellExecute,不过这里还有一些区别,这里的CreateProcess功能强一点不用再用ShellExecute,如果不另开进程也可以只用ShellExecute(不过这样就不是shell了)。一个程序在shell中可以选择后台运行,这样在打开子进程后可以继续解释命令不用等待,你的什么不能返回是扯淡。不要拿些个指令指针CS:IP来混弄人,或许你学了点8086实模式16位汇编,win32asm不知道你有没有学过。


在C++中,如果是void main()的话,理论上说,应该不会正常结束,当然,这完全是我的猜测,

你的帖子中全是这种“理论上”,“可能”,“猜测”的词,不知道你不会去查一下资料搞清楚?

俺刚来,也没有什么NB的技术,只是见不得别人糊弄初学者。


你这贴也可谓是精华了.


Repeat  Life=Study;Until (death);
2007-10-03 21:26
缘吇弹
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:地球
等 级:版主
威 望:43
帖 子:3038
专家分:27
注 册:2007-7-2
得分:0 
以下是引用冰的热度在2007-10-3 21:25:57的发言:
2.请告诉我,到底 LZ 是谁呀! 或是什么意思呀?

在本贴指的是阁下.


Repeat  Life=Study;Until (death);
2007-10-03 21:27
hero4587
Rank: 2
等 级:论坛游民
帖 子:20
专家分:10
注 册:2007-10-1
得分:0 
我是初学者   看了帖子学了不少东西   但是好象 lz 是 汉语 楼主  的  拼音缩写   一半指发帖子的 作者
2007-10-03 22:07
冰的热度
Rank: 2
等 级:禁止访问
威 望:5
帖 子:404
专家分:0
注 册:2006-12-2
得分:0 
哦,对对对,有道理.谢了.

科学是永恒之迷...... 我的博客http://blog..cn/u/1267727974 阅读我的blog,懂与不懂都是收获!
2007-10-03 22:17
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
得分:0 
你怎么总这样啊?

Fight  to win  or  die...
2007-10-04 12:56
郭芙蓉
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2007-10-3
得分:0 
秀才过来看你写的什么狗屁东西:

if((pid=waitpid(pid,&status,0))<0){ //parent process
printf(\"waitpid error\");
exit(1);
}


你知道我郭女侠最鄙视糊弄初学者的,这种人卑鄙下流无耻,只为换取初学者心目中的高手形象,我见一次打两次。
秀才你不是这种人吧?

2007-10-04 20:44
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
得分:0 
秀才,偶不与你抢了,原来是个母老虎

九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2007-10-04 23:20



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-174080-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.360340 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved