浅析C语言中的main函数
原文
some notes:
返回值: main()的返回值应该是int, 而不是void. 虽然在一些编译器中,void main()可以通过编译,但并非所有编译器都支持 void main(),因为标准中从来没有定义过 void main 。
main返回值类型:
main()函数传参
1 | int main(int argc , char* argv[],char* envp[]); |
参数说明:
①、第一个参数argc表示的是传入参数的个数 。
②、第二个参数char* argv[],是字符串数组,用来存放指向的字符串参数的指针数组,每一个元素指向一个参数。各成员含义如下:
argv[0]:指向程序运行的全路径名。
argv[1]:指向执行程序名后的第一个字符串 ,表示真正传入的第一个参数。
argv[2]:指向执行程序名后的第二个字符串 ,表示传入的第二个参数。
……argv[n]:指向执行程序名后的第n个字符串 ,表示传入的第n个参数。
规定:argv[argc]为NULL ,表示参数的结尾。
③、第三个参数char* envp[],也是一个字符串数组,主要是保存这用户环境中的变量字符串,以NULL结束。envp[]的每一个元素都包含ENVVAR=value形式的字符串,其中ENVVAR为环境变量,value为其对应的值。
envp一旦传入,它就只是单纯的字符串数组而已,不会随着程序动态设置发生改变。可以使用putenv函数实时修改环境变量,也能使用getenv实时查看环境变量,但是envp本身不会发生改变;平时使用到的比较少。
注意:main函数的参数char* argv[]和char* envp[]表示的是字符串数组,书写形式不止char* argv[]这一种,相应的argv[][]和char** argv均可。
对main()函数传参
格式: 可执行文件名 参数1 参数2 … … 参数n
eg:
1 | ffo@debian:~/Cprogramme$ gcc testmain.c |
main()的执行顺序
linux系统下程序的入口是”_start”,这个函数是linux系统库(Glibc)的一部分,当我们的程序和Glibc链接在一起形成最终的可执行文件的之后,这个函数就是程序执行初始化的入口函数。
1 | _start: |
所以在main()函数执行前还要做一系列的工作, 主要是初始化系统相关资源:
1 | Some of the stuff that has to happen before main(): |
在main函数执行前的函数:
(1)全局对象的构造函数会在main 函数之前执行。
(2)一些全局变量、对象和静态变量、对象的空间分配和赋初值就是在执行main函数之前,而main函数执行完后,还要去执行一些诸如释放空间、释放资源使用权等操作
(3)进程启动后,要执行一些初始化代码(如设置环境变量等),然后跳转到main执行。全局对象的构造也在main之前。
(4)通过关键字attribute,让一个函数在主函数之前运行,进行一些数据初始化、模块加载验证等。
作者:z_ryan
原文:https://blog.csdn.net/z_ryan/category_7316855.html
免责声明:本文来源网络,免费传达知识,版权归原作者所有。如涉及作品版权问题,请联系我进行删除。