C++ argv 索引大于 argc

C++ argv indices larger than argc

所以我一直试图在 C++ 中访问索引大于 argc 的命令行参数(因为为什么不这样做)并发现实际上有一些参数传递给了程序。以下代码在我的 Ubuntu 14.04 中产生以下结果:

#include <cstdio>
int main (int argc, char** argv) {
    for (int i=argc+1; argv[i]!=0; i++)
        printf("%3d %s\n", i, argv[i]);
}

这是输出:

  2 XDG_VTNR=7
  3 LC_PAPER=tr_TR.UTF-8
  4 LC_ADDRESS=tr_TR.UTF-8
  5 XDG_SESSION_ID=c2
  6 XDG_GREETER_DATA_DIR=/var/lib/lightdm-data/kubuzetto
  7 SELINUX_INIT=YES
  8 LC_MONETARY=tr_TR.UTF-8
  9 CLUTTER_IM_MODULE=xim
  (and so on)

这是什么,它是否依赖于发行版?

不要运行 argc,它没有定义。

在这种情况下,我们知道发生了什么。你看,main() 被声明和调用为

extern int main(int argc, char **argv, char **envp);

碰巧 argv 和 envp 的构建方式在 argv 之后立即留下了 envp,所以 运行最后遇到 envp。

它可能有一天会改变,所以不要依赖这个工作。如果您想依赖内核的传递方法,请自己提供内核的入口点(必须在 asm [或可能是裸函数] 中完成,因为它看起来不像函数调用)。