首页
社区
课程
招聘
[求助]main函数的参数问题
发表于: 2013-1-28 09:40 6204

[求助]main函数的参数问题

2013-1-28 09:40
6204
再CRT0.C 文件中是这样调用C程序的main函数的:

mainret = main(__argc, __argv, _environ);

我们写c程序时
//这边是定义main函数(这样子是没有问题的)
int main()
{
	return 0;
}


问题:为什么定义main函数时可以把参数省略?
反正下面这几种形式都可以
main()

main(int argc)

main(int argc, char *argv[])

main(int argc, char *argv[], char *env[])

这不是不符合C语言的语法规则吗???
哪位大哥解释一下

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 79
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
从你列举出的四个main函数的参数来看,参数都是有固定的顺序的。所以最有可能是main函数确实是有3个参数,但是使用main() 方式的时候默认三个参数都是void,main(int argc) 这种方式默认后两个参数是void。
     具体在深入我也不了解,只知道main也是函数,也要先push参数,C语言中默认是从右至左push参数,所以如果没有main参数的情况,则直接call main,本来返回地址前面应该是参数的值,但是因为没有push参数,所以直接把返回地址前面的值作为参数,而我估计这个值就是默认void的。然后其他两个参数,三个参数也是类似的吧。
2013-1-28 09:58
0
雪    币: 4817
活跃值: (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
你应该考虑,main既然是入口,那谁调用的?难道程序一运行,他就自动运行?当然不是,PE(程序)文件被加载到内存后(还有其他的操作,这里忽略),然后再PE文件头部(程序文件的前面是几个结构体)里会有个程序入口点,系统会调用这个入口点执行程序,难道这是程序的main?当然不是啦,在执行main前,会有编译器写好的一段代码,执行这段代码后才会调用你的main,可以这样说,系统调用程序入口点的方式是固定的,但入口点的代码可以根据你的main函数的参数,如果你不需要参数,他就直接调main,如果你需要参数调用main的时候,把参数传递给你,这一切,都是编译器编译的时候,根据你的main函数来确定的。

这完全符合C语法啊,又不是有两个不同参数的main存在!!!
2013-1-28 09:59
0
雪    币: 31
活跃值: (53)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
因为调用约定吧,c语言的调用约定是调用者平衡栈。
2013-1-28 10:15
0
雪    币: 45
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
你们还没有理解我的意思(参考C++反汇编与逆向技术解密 第三章)
比如说在main函数中调用 add函数
void add()
{

}

void main()
{
       
        int i;
        add(1,2,3);
}
这样子是会出问题的,系统中调用main函数就是这样子的,调用时有好3个参数,但我们定义的main函数没有参数也不会出问题???
2013-1-28 10:55
0
雪    币: 79
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我觉得三楼说的还是挺有道理的,我的那个解释还是有问题的。可能main函数是单独的约定,因为每一个程序都有main函数,但是其他你自己定义的函数编译器也不能跟你约定啊
2013-1-28 11:00
0
雪    币: 4817
活跃值: (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
我看大哥是没明白我的意思吧
add(1,2,3)是会出问题,是因为add函数没有三个参数。
但main函数不是你去调用的,也不是系统去调用,是编译器的代码去调用。当编译的时候,编译会根据你的main函数的参数,生成对应的调用函数,所以main支持多种情况,如果你的main没有参数,编译生成的调用main的代码就不会传入参数,如果你的main有三个参数,编译器生成的调用你的main的代码就会传递3个参数。

程序运行后,首先是运行编译器生成的代码的,然后这段代码会调用你的main。

不知道我这样说你能明白么?
2013-1-28 13:05
0
雪    币: 299
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
首先我要说是一个有效的PE程序是从OEP开始执行指令,并不是从main函数开始执行指令,所以main函数你只把它当做1个函数来看待就好了。
    编译器做的事情就是把高级代码转换成能执行的机器指令,至于怎么转换是编译器根据在不同平台不同需求所转换的机器指令也会有所不同。
    至于main函数这些格式都是由编译器的写法来决定的,编译器不同,main函数的格式和参数就会有所区别。后出的编译器会向下支持以前的main函数格式。
    建议你了解一下编译原理。
2013-1-28 15:21
0
游客
登录 | 注册 方可回帖
返回