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 [或可能是裸函数] 中完成,因为它看起来不像函数调用)。
所以我一直试图在 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 [或可能是裸函数] 中完成,因为它看起来不像函数调用)。