我在这里阅读: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
这里有两件事要注意,我认为它们有些不一致。
由于它们都是NULL终止的,因此严格来说argc
并不是必须的,即使它可以使某些事情变得容易一些。这样,您不必遍历整个数组即可找到大小。但是这些好处也适用于env
。
这里的理由是什么?他们为什么选择不同的方法?
答案 0 :(得分:2)
我对早期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
确实是多余的。