首页 > 解决方案 > 为什么 argc 存在/为什么 env 没有类似的东西?

问题描述

我在这里阅读:http: //asm.sourceforge.net/articles/startup.html#st

显然,ELF 二进制文件的堆栈布局是这样的:

argc          Number of arguments, which is the size of argv  
argv[0]       Program name
------------
argv[1]       Arguments that get passed to the program
...
argv[argc-1]
------------
NULL
------------
env[0]       Environmental variables
...
env[n]
-----------
NULL

这里有两点需要注意,我认为它们有点不一致。

  1. argv 和 env 都以 NULL 结尾。
  2. 只有 argv 有一个单独的大小变量。

由于它们是 NULL 终止argc的,严格来说没有必要,即使它可以使一些事情变得更容易。就像这样,您不必遍历整个数组即可找到大小。但这些好处也适用env

这里的理由是什么?他们为什么选择不同的方法?

标签: unixenvironment-variablescommand-line-arguments

解决方案


我对早期 Unix 设计者的想法没有特别的洞察力。但一方面,在很多情况下您想知道命令行参数的数量,例如if (argc < 3) usage();. 但我想不出你真正关心环境中设置了多少变量的任何情况。可以理解,用户可能设置了许多与您的程序无关的环境变量,您的程序应该忽略它们。因此,环境数组中是否有 5 个或 500 个条目不是您的程序应该关心的;你应该只寻找那些你已经记录为对你的程序有影响的人。

因此,拥有envc变量的唯一原因是做类似的事情

int i;
for (i = 0; i < envc; i++) {
    if (strncmp(env[i], "FROB=", strlen("FROB=")) == 0) {
        frob();
    }
}

但这就像写成一样容易

char **p;
for (p = env; *p; p++) {
    if (strncmp(*p, "FROB=", strlen("FROB=")) == 0) {
        frob();
    }
}

另一方面,如果argc没有提供,那么类似的东西if (argc < 3) usage();将需要更多的代码行。

因此,拥有argc,这在技术上是不必要的,但很方便;而拥有envc确实是多余的。


推荐阅读