浅析C语言中的main函数

原文

some notes:

返回值: main()的返回值应该是int, 而不是void. 虽然在一些编译器中,void main()可以通过编译,但并非所有编译器都支持 void main(),因为标准中从来没有定义过 void main 。

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
2
ffo@debian:~/Cprogramme$ gcc testmain.c 
ffo@debian:~/Cprogramme$ ./a.out 1 2 3

main()的执行顺序

linux系统下程序的入口是”_start”,这个函数是linux系统库(Glibc)的一部分,当我们的程序和Glibc链接在一起形成最终的可执行文件的之后,这个函数就是程序执行初始化的入口函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
_start:
xor ebp, ebp //清空ebp
pop esi //保存argc,esi = argc
mov esp, ecx //保存argv, ecx = argv

push esp //参数7保存当前栈顶
push edx //参数6
push __libc_csu_fini//参数5
push __libc_csu_init//参数4
push ecx //参数3
push esi //参数2
push main//参数1
call _libc_start_main

hlt

所以在main()函数执行前还要做一系列的工作, 主要是初始化系统相关资源:

1
2
3
4
5
6
7
8
9
10
11
12
13
Some of the stuff that has to happen before main():

set up initial stack pointer

initialize static and global data

zero out uninitialized data

run global constructors

Some of this comes with the runtime library's crt0.o file or its __start() function. Some of it you need to do yourself.

Crt0 is a synonym for the C runtime library.

在main函数执行前的函数:

(1)全局对象的构造函数会在main 函数之前执行。

(2)一些全局变量、对象和静态变量、对象的空间分配和赋初值就是在执行main函数之前,而main函数执行完后,还要去执行一些诸如释放空间、释放资源使用权等操作

(3)进程启动后,要执行一些初始化代码(如设置环境变量等),然后跳转到main执行。全局对象的构造也在main之前。

(4)通过关键字attribute,让一个函数在主函数之前运行,进行一些数据初始化、模块加载验证等。

作者:z_ryan

原文:https://blog.csdn.net/z_ryan/category_7316855.html

免责声明:本文来源网络,免费传达知识,版权归原作者所有。如涉及作品版权问题,请联系我进行删除。