主函数的三个参数
在windows下,c语言的主函数默认有两个参数;
很多人会惊奇,这是什么,好像从没有听说过????
我们在写C代码的时候都是习惯性的新建空项目然后自己添加.cpp文件,但是可能有部分人习惯直接新建控制台程序,然后可能就会看到这么一段代码,其实两个参数是负责接收指令行参数的,很多在linux gcc或者g++下编译过c程序的人都知道他的指令格式是:
gcc 源文件名 -o 生成文件名
ps -f也是这个道理。
在Linux下,我们的主函数是有三个参数的:
int main(int argc,char *argv[],char * envp)
- argc:主函数的参数个数
- argv:主函数的参数内容
- envp:环境变量(默认情况下,环境变量是从父进程继承而来的)
我们可以看到如下的执行结果:
也就是主函数拿到的第一个参数就是:当前程序的路径全名称
上述指令中,hello和123都是传给主函数的参数,都是以字符串的形式接收
因此,若写成下面的形式,参数就发生了变化:
我们加入环境变量的输出:
envp的最后一个参数是空指针。
如下图所示,显示了部分的环境变量:
然后,我们增加一个自己的环境变量,命令如下:
总是,对于主函数参数的学习就到这里,实际上bash是main的父进程,bash帮我们把main进程运行起来,我们在bash中新增加了一个环境变量,所以main运行,会得到MYSTR这个环境变量。
printf方法的隐藏缓冲区
向屏幕输出显示信息时,C语言会使用printf方法,但实际上,它不会将输出结果直接输出到屏幕上,首先是将其要输出的内容写入到缓冲区中,待缓冲区放满后,就会把缓冲区的内容输出到屏幕上。
设立隐藏缓冲区的原因:
——效率,printf输出的内容要打印到屏幕上,是需要调用系统接口来完成的,屏幕是硬件设备,是由操作系统来管理的,因此它在输出时需要调用系统接口来完成,也就需要从用户态切换到内核态,如果我们多次调用printf,那么就会在这两种状态之间来回切换,造成很大的开销。
只有满足以下三种情况之一,才会将缓冲区中的内容输出到屏幕:
- 缓冲区满
- 强制刷新缓冲区
fflush(stdout)
或者加上\n
- 程序结束时
运行后,程序是先闪五秒空格才出现输出,原因是进程先刷新缓冲区再退出,调用exit(0)
后,先刷新缓冲区,再调用_exit(0)
(真正退出进程的方法),因为该方法只会退出进程,不会刷新缓冲区
若将代码修改为_exit(0)方法,则不会将缓冲区的内容输出到屏幕上,
若给printf后加上\n也会刷新缓冲区,同样强制刷新也可以输出到屏幕上:
小总结
- 其实C语言中的标准IO函数(不仅仅是printf),都是具有缓存功能的;