标题:[原创]深入讲解main()返回值问题
只看楼主
felicia
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2007-9-21
得分:0 
以下是引用leeco在2007-9-30 23:14:59的发言:
说了=没说

agree


2007-10-01 00:02
yuyunliuhen
Rank: 6Rank: 6
等 级:贵宾
威 望:20
帖 子:1435
专家分:0
注 册:2005-12-12
得分:0 
以下是引用leeco在2007-9-30 23:14:59的发言:
说了=没说

盖公章。名曰“同意”


Go confidently in the  directions of your dreams,live the life you have imagined!Just do it!
It is no use learning without thinking!
2007-10-01 08:58
栖柏
Rank: 2
等 级:论坛游民
威 望:3
帖 子:1103
专家分:17
注 册:2007-8-23
得分:0 

,呵呵,有意思


You have lots more to work on! Never give up!c language!
2007-10-01 09:16
mingreign
Rank: 1
等 级:新手上路
帖 子:66
专家分:0
注 册:2007-9-15
得分:0 
回复:(冰的热度)[原创]深入讲解main()返回值问题
    你说了,如果没有返回值,程序结束后可以继续执行其他的程序,也就是再这个程序后面的程序.然而,大家都经常碰到按任意键,可以继续执行着个程序呀.
2007-10-01 11:31
秀才
Rank: 1
等 级:新手上路
帖 子:56
专家分:0
注 册:2007-9-30
得分:0 


用户的命令由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的技术,只是见不得别人糊弄初学者。

[此贴子已经被作者于2007-10-1 17:44:23编辑过]


2007-10-01 17:41
冰的热度
Rank: 2
等 级:禁止访问
威 望:5
帖 子:404
专家分:0
注 册:2006-12-2
得分:0 
回复:(秀才)[quote]用户的命令由command执行,首先c...
大家鼓掌......

感谢你给我补充了点"营养元素"

学到东西喽,耶......

科学是永恒之迷...... 我的博客http://blog..cn/u/1267727974 阅读我的blog,懂与不懂都是收获!
2007-10-01 18:28
秀才
Rank: 1
等 级:新手上路
帖 子:56
专家分:0
注 册:2007-9-30
得分:0 

2007-10-01 19:11
栖柏
Rank: 2
等 级:论坛游民
威 望:3
帖 子:1103
专家分:17
注 册:2007-8-23
得分:0 
楼上有个问题说的不太清楚
关于void main();的
请问void 会转为int 么?

You have lots more to work on! Never give up!c language!
2007-10-02 22:35
编程高手
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2007-10-2
得分:0 
LZ分明是不懂装懂嘛,错漏百出,还说那么多好像和似乎之类的词,明显就是滥竽充数
还有楼上,这么简单的问题怎么问得出来啊,如果会自动转那还写int main干嘛?动动脑子都想得到啊
2007-10-03 02:10
cince
Rank: 1
等 级:新手上路
威 望:1
帖 子:108
专家分:0
注 册:2007-1-21
得分:0 
楼上的分明是吃饱撑着没事干.

看了秀才的回复..虽然语言有点那个...但讲解的很精彩...可是...在你的回复中却不见解说"进

程"是指什么?以及他的理论..能否纯理论的讲讲?(本人是初学者,忘请见谅).

对于楼主...他所写的只是自己的看法...个人的看法也许是错的..但是把他拿出来共享,却不失一个程

序员的风范..

对于秀才呢..反驳有理也有据..而且让我学到很多(鼓掌)..我也得学学其中的技术(不学他的说话方式.

或许我以前有那样子)


There Is Nothing Impossible In My Dictionary.
2007-10-03 12:15



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




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

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