你真的了解main函数吗?

Posted KookNut39

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了你真的了解main函数吗?相关的知识,希望对你有一定的参考价值。

大家好,我是KookNut39,在CSDN写文,分享一些自己认为在学习过程中比较重要的东西,致力于帮助初学者入门,希望可以帮助你进步。最近在更新C/C++方面的知识,感兴趣的欢迎关注博主,可以去专栏查看之前的文章,希望未来能和大家共同探讨技术。

我们每写一个C程序或者C++程序,都需要敲下这样的一个函数名main,但是为什么要有main函数?main函数真实的面容又是什么样呢?
为什么要有main函数或者main函数的作用是什么?前两天一个初学者问我问题,说他的代码报错了,没法运行,然后我定睛一看,整个代码没有main函数,所以报错了!

这个问题对于已经入门的人来说,可能不会犯,但是对于新手来说,他感觉自己照着书上的代码写的,为什么连编译都不行呢?很是郁闷啊!!并且他并不理解,为什么写了main编译就通过了,但是我还是运行不出来想要的结果呢(main函数中没有调用他写的函数,也没有执行什么其它的操作),所以main函数究竟是干什么的?
我们平时见到的main函数大致是这个样子的:

int main()
{
	........
	return 0;
}
void main()
{
	........
	return;
}

main函数是C语言或者C++程序的一个入口,我们需要编译生成一个可执行项目的过程中会经过好几个阶段,而在生成的可执行文件中,main函数就是它的入口,就好比我们需要盖一个房子,为了我们进出方便,肯定是有一个大门,房子里面有厨房、洗手间、卧室、书房等等的细节,但是进入房子的门只有一个!而我们想要进到房子里面去睡觉、上洗手间,需要先打开房门,对于一个exe程序来说,main函数就是它的房门,没有房门,完全密闭的一个房子,里面不管有多么的精致,你也无法享受!通过这道房门,在房子里面装上各种功能器件,那就可以享受了!所以main函数是不可或缺的程序入口,也是一切的开始。
但是我们是否又见过这样的main函数呢?

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

嗯?main函数居然还有参数?为什么我从来没见过main函数的参数啊?这些参数我们怎么获得?那参数又是怎么传到程序中的呢?
确实!main函数是有参数的,你没有看错!我来解释一下这三个参数:
第一个参数是一个整型,其中包括的是命令行参数的个数,第二参数是一个二维的char型指针,存放命令行参数字符串,第三参数是二维的char型指针,存放环境变量。那我们怎么获得命令行参数呢?写一个简答的示例代码:

int args_parse(int argc, char** argv)
{
	//argv[0] 是当前进程名
	int i = 0;
	while (i < argc)
	{
		printf("%s\\r\\n", argv[i]);
		i++;
	}
	return 0;
}
int main(int argc, char** argv, char** envp)
{
	args_parse(argc,argv);
	return 0;
}

我在函数args_parse中定义了两个参数,然后在main函数传参就直接把main函数参数传入进去,这些参数都是程序从外部获取的,我们只需要取出即可。当我们没有输入任何的命令行参数的时候,这个程序会输出当前进程名,因为命令行参数的第一参数是当前进程名:

使用命令行参数有什么作用?使用命令行参数可以控制程序的执行,我们的程序可能实现了很多的功能,就比如图书管理系统,有增加图书,查书籍等等不同的功能,这些功能有自己的代码段,我们如何可以定位去执行哪一段代码呢?这时候就可以利用参数的方式,我们在命令行传入的参数,就好比一个指令,在程序内部设计指令识别,然后对不同指令解析去执行不同的功能模块。那我们怎么传入命令行参数呢
我们可以从cmd传入,将当前可执行文件完整路径输入,接着随便输几个字符串,然后看看效果,举例:

我们在此处可执行文件完整路径后面输入的,都是命令行参数!那么新的问题来了,如果我代码有问题,想调试一下,但是调试过程中没法输入命令行参数啊,毕竟命令行参数是在main函数执行之前就传入的,这时候怎么办呢?我们拿vs举例:

右键选择当前项目,点击属性,然后点击调试–>命令行参数,然后输入就可以了:

动态操作流程:

每个进程都有一个与它相关的环境块,在进程地址空间分配时候会为环境变量分配一块内存,每个字符串的第一部分是一个环境变量的名称,后跟一个等号,等号之后是希望赋给此变量的值。这种字符不能作为环境变量使用。那么怎么获取环境变量呢?

void envp_parse(char** envp)
{
	int i = 0;
	char** Travel = envp;
	while (NULL != Travel)
	{
		if (NULL == *Travel)
		{
			printf("Envp Over!!!\\r\\n");
			return;
		}
		else
		{
			printf("%s\\r\\n", *Travel);
		}
		Travel++;
	}
}
int main(int argc, char** argv, char** envp)
{
	//args_parse(argc,argv);
	envp_parse(envp);
	getchar();
	return 0;
}

运行效果部分图:

有关main函数的简单科普就到此结束啦!下篇博文与各位再见面喽!!!

码字不易,如果喜欢,赏个点赞+评论+收藏🤞🤞🤞,感谢您的支持

惯例,今日份吟诗一句“数风流人物,还看今朝”

以上是关于你真的了解main函数吗?的主要内容,如果未能解决你的问题,请参考以下文章

你真的了解[super ]关键字吗?

连载(学了这么多年C语言,你真的了解static关键词吗)乐创DIY C语言讲义​——4.4节

你真的了解箭头函数吗

你真的了解箭头函数吗

你真的了解箭头函数吗

你真的了解 defer 吗?