命令行参数在哪里?

Posted

技术标签:

【中文标题】命令行参数在哪里?【英文标题】:Where do command line arguments reside? 【发布时间】:2016-05-06 14:22:27 【问题描述】:

已知C语言中main函数的原型是int main(int argc, char **argv)。 argv 数组指向的那些字符串在哪里?他们在哪个内存段?数据、栈还是堆?

谢谢。

【问题讨论】:

也许这会有所帮助。 ***.com/questions/14588767/… @kaylum:所谓的重复要求在 C 语言级别,唯一的答案是“实现定义的”。这里注意linux标签:它是关于一个具体的实现。 【参考方案1】:

在 Linux 下,当程序启动时,指针本身和它们指向的字符串都在堆栈上。这将在main() 的堆栈帧上方的某个位置。 C 库启动代码负责将适当的指针传递给main()

您可以在函数create_elf_tables() 中的fs/binfmt_elf.c 中找到设置新程序堆栈的内核代码,包括参数和其他所有内容。

(我刚刚了解到的有趣事实:在堆栈的更深处,您可以找到 16 个随机字节,由内核在 exec 时间放置在那里,以方便您进行 RNG 播种。以防万一您不想去麻烦打开/dev/urandom。)

【讨论】:

进一步?这是否意味着 main() 可以有三个以上的参数,以便您可以访问这些字节?如果是这样,原型会是什么?如果没有,你如何到达这些字节? 您,用户,不应该联系他们。 C 库启动代码可以访问它们,因为当程序开始执行时,它们位于堆栈底部的已知偏移量 (%rsp)。例如,它可以使用它们调用srand()。但是除非你非常熟悉 C 启动代码的作用,或者除非它以某种方式使这些字节可用(我不知道它是否可用),否则你的代码将无法知道它们在哪里。跨度> 实际上,main() 确实有一个可选的 3 参数。指向环境的指针。但是,第三个参数很少使用。

以上是关于命令行参数在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

在 Julia 中访问命令行参数

main() 如何接收命令行参数?

C++ 如何将命令行参数转换为数组?

命令行参数分段错误(核心转储)

pytestconfig--获取命令行参数及pytest.ini文件配置

如何将两个整数参数传入并使用 C# 命令行程序? [复制]