Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >c语言main函数里的参数argv和argc解析

c语言main函数里的参数argv和argc解析

作者头像
用户6280468
发布于 2022-03-21 01:19:14
发布于 2022-03-21 01:19:14
3.3K00
代码可运行
举报
文章被收录于专栏:txp玩Linuxtxp玩Linux
运行总次数:0
代码可运行

前言

一般我们平时写main函数的话,一般都是写不带参数的比较多,而且也习惯了这样写;其实标准的形式写法,main函数是带两个参数的,这两个参数分别是:argc和argv,那么这两个参数是表示什么意思,怎么用呢?今天就给大家分享main函数里面这两个参数的使用,下面看到这样的写法,要明白这样写的意思哦!

main函数返回给谁

01函数为什么需要返回值

  • 函数在设计的时候设计了参数和返回值,参数是函数的输入,返回值是函数的输出。
  • 因为函数需要对外输出数据(实际上是函数运行的一些结果值),因此需要返回值。
  • 形式上来说,函数被另外一个函数所调用,返回值作为函数式的值返回给调用这个函数的地方。
  • 总的来说,函数的返回值就是给调用的地方返回一个值。

02main函数被谁调用

(1)main函数是特殊的,首先这个名字是特殊的;因为在c语言里面规定了main函数是整个程序的入口;其它函数只有直接或者间接被main函数所调用才能被执行,如果没用被main函数直接或者间接调用,则这个函数在整个程序中无用。

(2)main函数从某种角度来讲,它代表了当前这个程序,或者说是整个程序;main函数的开始意味着整个程序开始执行,main函数的结束返回意味着整个程序的结束。

(3)谁执行了这个程序,谁就调用了main函数。

03Linux下一个程序执行的本质

(1)表面来看,Linux中在命令行中去./xx去执行一个可执行程序。

(2)我们可以通过shell脚本来调用执行一个程序(下面会写一个shell脚本)。

(3)我们还可以在程序总去调用执行一个程序(fork exec),这个在Linux应用编程里面的文章里面有写过这个,可以参考这篇文章——Linux系统下进程编程之exec族函数解析(四)

(4)我们有多种方法来执行一个程序,但是本质上都是相同的。Linux中一个新程序的执行本质上是一个进程的创建、加载、运行、消亡。Linux中执行一个程序其实就是创建一个新进程,然后把这个程序丢进这个进程中去执行,直到结束。新进程是被谁开启?在Linux中进程都是被它的的父进程fork出来的。

(5)命令行本身就是一个进程(就是我们平时在Linux下打开一个终端),在命令行下去./xx执行一个程序,其实这个新程序是作为命令行进程的一个子进程去执行的。总之一句来说,一个程序被它的父进程所调用。

(6)小结:main 函数返回给调用这个函数的父进程;父进程要这个这个返回值干嘛?父进程调用子进程来执行一个任务,然后子进程执行完后,通过main函数的返回值返回给父进程一个答复,这个答复一般是表示子进程的任务执行结果完成了还是错误的(0表示执行成功,负数时表示执行失败)。

04实践验证获取main的返回值

(1)用shell脚本执行程序可以获取程序的返回值并且打印出来:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  #include <stdio.h>
  int main(void)
  {
                       return 0;
  }

然后我再创建一个shell脚本:

shell脚本里面的内容为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  #!/bin/sh

 ./a.out
 echo $?

执行结果为:

说明:Linux  shell中用$?这个符号来存储和表示上一个程序执行结果(这里就是./a.out)。#!/bin/sh这个书写shell脚本的格式。

argc、argv

01main的书写形式

一般正规main函数的书写形式有三种:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 int main(void)
 int main(int argc, char **argv)
 int main(int argc, char *argv[])

02谁给main函数传参

(1)调用main函数所在的程序的它的父进程给main函数传参,并且接收main的返回值。

03为什么要给main函数传参

(1)首先,main函数不传参是可以的,也就是说父进程调用子进程并且给子进程传参不是必须的;int main(void)这种形式就是不要传参了。

(2)有时候我们希望程序有一种灵活性,所以选择在执行程序时通过传参来控制程序中的运行,达到不需要重新编译程序就可以改变程序运行结果的效果。下面我先一个简单的程序为例来引出这个程序的灵活性:

我们可以看到如果要改程序里面的内容的话,必须得修改源代码才行,这样灵活不是很好。下面就是我们要讲的,给main函数传参,来提高程序的灵活性。

04给main怎样来传参

(1)给main传参通过argc和argv这两个c语言预订的参数一起实现。

(2)argc是int类型的,表示运行程序的时候给main函数传递了几个参数;而argv是一个字符串数组,这个数组用来存储多个字符串,每个字符串就是我们给main函数传的一个参数,argv[0]就是我们给main函数的第一个传参,argv[1]就是传给main的第二个参数,以此类推后面的传参。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
运行结果:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
然后我在执行程序的时候,可以加参数:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
注意:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
     (1)main函数传参都是通过字符串传进去。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
     (2)程序被调用时传参,各个参数之间是通过空格来间隔的。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
     (3)在程序内部如果要使用argv,那么最好先检查一下argc。

总结

今天的分享就到这里结束了,关于shell脚本的教程,后面也会专门写一系列的文章来讲的。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-02-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 txp玩Linux 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
干货 | 深度剖析C语言的main函数
main函数的返回值用于说明程序的退出状态。如果返回0,则代表程序正常退出。返回其它数字的含义则由系统决定。通常,返回非零代表程序异常退出。
C语言与CPP编程
2020/12/10
2.2K1
干货 | 深度剖析C语言的main函数
【Linux】Linux环境变量的理解 --- 命令行参数、shell子进程、环境变量、本地变量…
1. 我们平常所用的Linux指令其实也是可执行程序,和我们自己写的二进制程序没什么两样,那么为什么在执行自己的程序的时候需要加上./,而执行这些系统提供的指令(可执行程序),不需要加上./呢?
举杯邀明月
2023/04/12
2.2K0
【Linux】Linux环境变量的理解 --- 命令行参数、shell子进程、环境变量、本地变量…
Linux:进程替换
        为什么要有进程替换呢???比方说我们想用fork创建一个子进程去帮助我们完成一个工作,这个工作我们需要封装成一个函数去使用,但难道我们每次都要自己写一个函数吗?或者说子进程一定要用我父进程的代码吗?  难道不可以是我们之前已经写好的一个可执行程序,当我想去执行的时候直接让子进程用一下不就可以了,但是因为操作系统不相信任何人,所以我们也必须要有一些系统调用接口来完成这个工作。
小陈在拼命
2024/10/15
2480
Linux:进程替换
基于C语言--解读main(int agrc,char* argv[ ])(命令行参数+环境变量)
之前学习这个linux的管道的时候,老师上课就讲到了linux系统编程这个管道的时候,main函数里面的这个命令行参数,当时我只是去找了一篇博客学习了一下,但是也只是一知半解,今天是真的系统学习了一下;
阑梦清川
2025/02/24
540
基于C语言--解读main(int agrc,char* argv[ ])(命令行参数+环境变量)
关于main函数参数列表的那些事
破晓的历程
2024/06/24
1140
关于main函数参数列表的那些事
【Linux】进程详解:命令行参数、环境变量及地址空间
🌈之前在这篇文章中【Linux】进程管理:状态与优先级调度的深度分析就已经简述了 进程的部分相关内容,下面我们来进一步深入了解进程的命令行参数以及环境变量和进程地址空间。
IsLand1314
2024/10/15
1560
【Linux】进程详解:命令行参数、环境变量及地址空间
面试大全 | C语言高级部分总结
内存物理看是有很多个 Bank(就是行列阵式的存储芯片),每一个 Bank 的列就是位宽 ,每一行就是 Words,则存储单元数量=行数(words)×列数(位宽)×Bank的数量;通常也用 M×W 的方式来表示芯片的容量(或者说是芯片的规格/组织结构)。
C语言与CPP编程
2021/03/10
2K0
面试大全 | C语言高级部分总结
Linux系统下进程编程之exec族函数解析(四)
fork函数是用于创建一个子进程,该子进程几乎是父进程的副本,而有时我们希望子进程去执行另外的程序,exec函数族就提供了一个在进程中启动另一个程序执行的方法。它可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段、代码段和堆栈段,在执行完之后,原调用进程的内容除了进程号外,其他全部被新程序的内容替换了。另外,这里的可执行文件既可以是二进制文件,也可以是Linux下任何可执行脚本文件。
用户6280468
2022/03/18
1.4K0
Linux系统下进程编程之exec族函数解析(四)
那些年我们一起忘掉的C (十九).main函数传参
C语言中虽然所有函数都是平行的,但是main函数还是有些特殊,它可以调用其它函数,但是不能被其它函数所调用,那如何调用main函数呢,可以通过命令行给main函数传参
franket
2021/10/18
5450
【Linux】命令行参数和环境变量
并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发。
aosei
2024/01/23
1720
【Linux】命令行参数和环境变量
main函数与命令行参数
执行程序时,可以从命令行传值给C程序。这些值被称为命令行参数,特别是想从外部控制程序,不是通过在代码内对这些值进行硬编码时,而是通过参数来控制代码部分逻辑。 int main(int argc,char *argv[]) argc:命令行参数个数(不给main()函数传递参数时默认值为1,即至少有一个参数为该可执行文件的文件名(含目录)) argv:命令行参数数组(分别指向各个字符串参数的首地址,其中argv[0]存储的是可执行文件的文件名的首地址。)
用户7272142
2023/10/11
4140
main函数与命令行参数
Linux下c语言中的main函数是如何被调用的
当我们在shell下执行一个程序的时候,shell内部首先会用fork系统调用来新建一个进程,然后再用execve系统调用把目标程序加载到内存中,并将其参数及环境变量等压入栈中,之后再执行目标程序的入口函数。
KINGYT
2019/05/30
3.3K0
C语言的main函数到底该怎么写
main函数是程序执行自定义的第一个函数。从开始学习C语言到现在,我们似乎看到了很多个版本的main函数,那么哪一种才是正确的呢?我们先来看看目前有哪些版本。
编程珠玑
2019/09/03
1.5K0
C语言的main函数到底该怎么写
OpenvSwitch系列之浅析main函数
通过前面几篇解析OpenvSwitch内部主要数据结构和流程,对OpenvSwitch有了相对简单的了解,由于本人不是专业搞OpenvSwitch的,纯属业余爱好,今天可能是OpenvSwitch最后一篇了,我们要做到有始有终嘛,所以我们来分析一下main函数。然而main函数里面涉及内容比较多,而且比较深入,所以这篇文章只是浅析,不能算深入剖析,希望以后能有哪位大神能够做一个深入剖析。 自己在学习开源软件总是喜欢看一下main函数,认为不把main函数搞明白了,就不算一个好程序员!!其实把main函数搞明
SDNLAB
2018/04/03
1.8K0
OpenvSwitch系列之浅析main函数
【Linux】详谈命令行参数&&环境变量
我们的main函数正常来说是没有参数的,其实我们也可以给我们的main函数加上参数。main函数的第一个参数为argc,参数类型为int,第二个参数为argv,参数类型为char*类型的指针数组(也叫命令行参数表),该指针数组以NULL结尾。当我们在命令行解释器输入一串指令时,命令行解释器会将这一串指令当成一个字符串,并以空格作为分隔符,将这个字符串分割成更小的字符串,并将这些更小的字符串分别存到argv数组中。main函数的argc和argv参数是由命令行解释器(通常是操作系统的shell/bash)维护的。当你从命令行运行一个程序时,命令行解释器会负责解析命令行中的各个部分,包括程序名(即argv[0])和传递给程序的任何选项(即argv[1]、argv[2]等)。解释器还会计算选项的数量,并将其作为argc的值传递给main函数。命令行解释器会负责将这些信息正确地传递给程序的main函数,以便程序能够使用它们。
用户10923276
2024/03/28
4870
【Linux】详谈命令行参数&&环境变量
【Linux篇章】踏入 Linux 进程控制的奇幻迷宫,解锁系统调度奥秘(秒懂版)
因此;我们就可以把fork后理解成分流:返回的id=0的子进程是一个流而id=子进程pid 父进程是一个流;各自干各自的事。
羑悻的小杀马特.
2025/04/15
320
【Linux篇章】踏入 Linux 进程控制的奇幻迷宫,解锁系统调度奥秘(秒懂版)
main函数中的argc和argv到底是个啥?
今天和大家讨论一个常见的但是不容易深入了解的知识点。那就是 main 函数声明中使用到的 argc 和 argv 的含义。
Power7089
2020/07/27
5.6K0
main函数中的argc和argv到底是个啥?
环境变量简介
环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。
羑悻的小杀马特.
2025/01/23
950
环境变量简介
【Linux内核揭秘】深入理解命令行参数和环境变量
形如这样的命令后面带的选项就是命令行参数。 首先我们要了解一下命令行参数的原理。 我们知道像ls,mkdir,touch等等这些命令,都是用C语言写的可执行程序,所以必定会有main函数,我们以前学习C语言的时候也接触过一种main函数内部是传递参数的,学习C语言的时候,很难理解这些参数是什么意思,是因为这些参数是系统层面的,而不是语法层面的。 我们要理解命令行参数就需要先解决main函数的参数的问题。
用户11305458
2024/11/21
1660
【Linux内核揭秘】深入理解命令行参数和环境变量
C++关于main函数的几点说明
main函数是C++程序的入口函数,C++标准规定main()函数的返回值类型为int,返回值用于表示程序的退出状态,如果返回0则表示程序正常退出,如果返回非0,则表示出现异常。C++标准规定,main()函数原型有两种:
恋喵大鲤鱼
2019/02/22
7.1K0
推荐阅读
相关推荐
干货 | 深度剖析C语言的main函数
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验