【问题标题】:C++ argv indices larger than argcC++ argv 索引大于 argc
【发布时间】:2015-09-20 06:13:10
【问题描述】:

所以我一直在尝试访问索引大于 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)

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

【问题讨论】:

  • 这称为未定义行为。它是通用的。
  • @kubuzetto 你知道未定义的行为是什么意思吗?
  • 另外,您的环境变量似乎恰好放在内存中的命令行参数之后。

标签: linux gcc ubuntu-14.04 argv


【解决方案1】:

不要越过 argc,它没有定义。

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

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

碰巧构建 argv 和 envp 的方式在 argv 之后留下了 envp,所以跑到最后会遇到 envp。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-15
    • 2017-08-10
    • 1970-01-01
    • 2017-06-18
    • 2020-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多