命令行参数如何工作?

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

我将尝试比其他答案更多地解释实现。
我确信存在不准确之处,但希望它能够很好地描述相关部分。

在shell下,键入./myprog abc
shell解析它,并确定你想用三个参数运行./myproj
它调用fork来创建一个新进程,其中./myprog将运行。
子进程仍然运行shell程序,它准备一个包含5个字符指针的数组。 第一个将指向字符串./prog ,接下来的三个指向字符串abc ,最后一个指向NULL。
接下来,它调用execve函数,运行./myprog并创建参数数组。
execve./myprog加载到内存中,而不是shell程序。 它释放shell程序分配的所有内存,但确保保留参数数组。
在新程序中,调用main ,参数数组作为argv传递给它。

在C程序中,OS创建一个指向零终止字符串的指针数组。 计数作为argc传递,数组作为argv传递。 你已经知道了。 名称argcargv无关紧要。 您可以使用任何名称。 数据类型和顺序很重要… argv必须是intargc必须是char*[]char** 。 其他语言也有类似的机制。 例如,C#传递一个string[]参数,它是一个.NET数组,并在内部跟踪它的长度。 有关更多信息,请访问: http : //en.wikipedia.org/wiki/Main_function#C_and_C.2B.2B

环境变量名称与程序中的变量名称是分开的。 argcargv不是环境变量……它们是main()局部变量。

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

更新:您想知道这些程序如何可用。 操作系统就是这样做的。 但是在OS可以这样做之前,调用你的可执行文件的程序 – 调用者 – 可以处理你的命令行。 通常调用者是shell( bashcshzshcmd.exe )或桌面环境,如GNOME或Windows资源管理器。 调用者通过execve (on * nix)或CreateProcess (在Windows上)传递这些参数。

你给主要论点的名字是什么,重要的是它们的类型和顺序。 要获得env vars,请使用此闭包:

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

这是你想知道的吗?