该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
在C语言中,main函数是一个特殊的函数,它完整的原型是
int main( int argc, char **argv, char **argp);
无论你怎样写这个函数的参数,C编译器都会给它传递这三个参数。那么这是什么意思呢?
在C语言中,我们的第一条语句是从main函数开始的,但是,在编译后的exe文件中,在main函数之前有一段初始化代码,大致是内存管理和命令行参数处理。在exe文件中,程序大约是这样子的(以汇编形式):
.......(初始化代码)
push argp ; 传递参数argp
push argv ; 传递参数argv
push argc ; 传递参数argc
call _main ; 调用main函数,程序开始。
......(程序结束代码)
就是说,即使把main函数写成:
int main ( void)
{
......
}
的形式,程序也为main传递了argc,argv,argp参数。考察以下程序:
// 本程序用以显示命令行参数,在vs2010下调试。
// 为什么要特别说“vs2010“呢?因为本程序涉及到int和指针类型的长度,而在不同的编译器下它们可能不同。
#include "stdafx.h"
#include
int main( void)
{
int i;
char * p, *pv;
p = (char *)&i; // p取得栈地址
p += 16; // p指向参数argc,虽然参数表中没有这个argc。
i = (int)(int *)*p; // i = argc
printf("命令行共有%d个参数。\n", i);
p += 4; // p指向参数argv,虽然参数表中没有这个argv。
pv = (char *)*(DWORD *)p;// pv = argv
// 以下显示各个命令行参数
while(i)
{
printf("%s\n", *(DWORD *)pv);
i--;
pv += 4;
}
getchar();
return 0;
}