C 命令行参数是如何工作的?

C 命令行参数是如何工作的?,c,command-line-arguments,C,Command Line Arguments,正如问题所提到的,命令行参数在C语言(通常是任何语言)中是如何工作的。我能想到的逻辑解释是,操作系统在进程启动时为进程设置了某种环境值。 但是如果这是真的,我就不能以argp[I]等方式访问它们(我修改了main,希望第二个参数为char**argp,而不是**argv)。请解释。无论您给主要参数起什么名字,重要的是它们的类型和顺序。要获取环境变量,请使用此闭包: int main(int argc, char ** myCommandLineArguments, char ** myEnvir

正如问题所提到的,命令行参数在C语言(通常是任何语言)中是如何工作的。我能想到的逻辑解释是,操作系统在进程启动时为进程设置了某种环境值。
但是如果这是真的,我就不能以argp[I]等方式访问它们(我修改了main,希望第二个参数为char**argp,而不是**argv)。请解释。

无论您给主要参数起什么名字,重要的是它们的类型和顺序。要获取环境变量,请使用此闭包:

int main(int argc, char ** myCommandLineArguments, char ** myEnvironmentVars)

这就是你想知道的吗?

在C程序中,操作系统会创建指向以零结尾的字符串的指针数组。计数作为
argc
传递,数组作为
argv
传递。你已经知道了。名称
argc
argv
无关紧要。你可以用任何名字。数据类型和顺序很重要
argv
必须是
int
argc
必须是
char*[]
char**
。其他语言也有类似的机制。例如,C#传递一个
string[]
参数,该参数是一个.NET数组,并在内部跟踪其长度。有关更多信息,请访问:

环境变量名与程序中的变量名是分开的<代码>argc和
argv
不是环境变量。。。它们是
main()
的本地变量

要访问环境变量,请使用
getenv()


更新:您想知道这些是如何提供给程序的。是操作系统做到了这一点。但是在操作系统可以这样做之前,调用您的可执行文件(调用者)的程序将处理您的命令行。通常,调用方是shell(
bash
csh
zsh
cmd.exe
)或像GNOME或Windows Explorer这样的桌面环境。调用者通过(on*nix)或(在Windows上)传递这些参数。

我将尝试比其他答案更详细地解释实现。
我肯定有不准确的地方,但希望它能很好地描述相关部分。

在shell下,键入
/myprog a b c

shell对其进行解析,并确定您希望使用三个参数运行
/myproj

它调用
fork
,以创建一个新进程,其中将运行
/myprog

仍然运行shell程序的子进程准备了一个由5个字符组成的指针数组。第一个将指向字符串
/prog
,下三个指向字符串
a
b
c
,最后一个设置为NULL。
接下来,它调用
execve
函数,在创建参数数组的情况下运行
/myprog

execve
/myprog
加载到内存中,而不是shell程序。它释放shell程序分配的所有内存,但确保保留参数数组。

在新程序中,调用了
main
,并将参数数组作为
argv
传递给它

为什么您认为不能作为argp[i]访问它们?(请注意,函数参数名称在编译程序中通常没有意义,将2.参数命名为main
argv
只是一种惯例,如果需要,可以将其命名为
FOOBAR
main
的参数与任何其他函数的参数一样。名称并不重要,您甚至可以在函数原型和实际函数中使用不同的参数名称,只要类型匹配即可。
main
的参数来自何处并不重要,只需将它们视为任何整数和指针数组(在您的例子中是指向指针的指针)。谢谢您的回答。实际上,我的问题不是如何访问它们,而是关于谁以及如何使它们可用于程序。为什么
execve
不需要
argc
参数?实际上,数组将包含五个条目,不要忘记第一个(第零个)中的程序名它可能使用fork exec以外的其他机制来实际创建新进程。这完全取决于操作系统,就本问题而言,这并不重要。无论操作系统和shell使用何种机制来运行命令,都必须传递命令行参数。这是一种类似UNIX的操作方式,其中参数由
fork
和“survive”
execve
@JoachimPileborg“克隆”,感谢您的更正,我编辑了答案。@SteveJessop,您是对的,我解释了一个实现,它可能不是对任何操作系统的准确描述。但我认为,描述一个简单的机制,它本可以用来帮助你更好地理解事情,而不仅仅是说你保证得到什么。