main函数返回值
main函数, 是C语言程序的主函数,要求有返回值且该返回值返回给(如操作系统)来表明该程序的执行状况。返回0代表程序正常执行成功,通常,返回非零代表程序异常退出,因此返回值需要是int整型,于是有了int main()
的规范。
如果使用void main()
,即声明主函数没有返回值,程序虽能编译、运行成功,却不利于程序的激活者判断其状态,所以我们应该抛弃void main()
这种写法,坚持int main()
的规范。
main函数参数
理论上说,main函数的参数可以无限多个。
一般有以下几种形式:
int main( void );
int main( int argc, char *argv[ ] );
int main( int argc, char *argv[ ], char *envp[ ] );//一般用不上
argc
表示的是传入参数的个数,argc
参数始终大于或等于 1。
char* argv[]
,是字符串数组,用来存放指向的字符串参数的指针数组,每一个元素指向一个参数。
argv[0]
:指向程序运行的全路径名(程序的文件名)。
argv[1]
:指向执行程序名后的第一个字符串 ,表示真正传入的第一个参数。
argv[2]
:指向执行程序名后的第二个字符串 ,表示传入的第二个参数。
……argv[n]
:指向执行程序名后的第n个字符串 ,表示传入的第n个参数。
规定:argv[argc]始终为NULL
,表示参数的结尾。
char* envp[]
,也是一个字符串数组,主要是保存这用户环境中的变量字符串,以NULL
结束。envp[]
的每一个元素都包含ENVVAR=value
形式的字符串,其中ENVVAR
为环境变量,value
为其对应的值。(一般用不上)
#include <stdio.h>
int main(int argc ,char* argv[] ,char* envp[])
{
int i = 0;
while(envp[i++])
{
printf("%s", envp[i]);//相当于linux的env
}//会将所有的环境变量打印出来
return 0;
}
main的执行顺序
出乎我意料的是,main函数并不是程序执行的第一个函数。
linux
系统下程序的入口是”_start
”,这个函数是linux系统库
的一部分,当我们的程序和linux系统库
链接在一起形成最终的可执行文件的之后,这个函数就是程序执行初始化的入口函数。
main函数运行之前的工作:(这里目前不太懂)
1.设置栈指针
2.初始化static静态和global全局变量,即data段的内容
3.将未初始化部分的赋初值:数值型short,int,long等为0,bool为FALSE,指针为NULL,等等,即.bss段的内容
4.运行全局构造器,类似c++中全局构造函数
5.将main函数的参数,argc,argv等传递给main函数,然后才真正运行main函数