为argv []分配了多少内存?

时间:2016-09-21 21:13:27

标签: c++ linux command-line-arguments

我知道命令行参数是字符数组,它们存储在堆栈中。但我想知道为每个参数分配的实际内存。例如假设我传递了目录名称" / tmp"作为命令行参数。这将存储在argv [1]中。但是在我测试时,允许将argv [1]更改为" / tmp / log /" (程度增加)。这怎么可能?

3 个答案:

答案 0 :(得分:1)

在Linux上,参数由create_elf_tables填充。至少对于这个特定平台,您认为值存储在堆栈中是正确的。

Linux仅使用与在堆栈上存储参数和(初始)环境变量所需的内存完全相同的内存;如果你试图使用的东西超过已经存在的东西,你就会覆盖别的东西(或者崩溃)。

答案 1 :(得分:1)

要回答您的问题,可以使用以下方法获取参数字符串和传递环境的总最大大小:

getconf ARG_MAX

来自命令行或来自C的syconf等效项(有关详细信息,请参阅http://pubs.opengroup.org/onlinepubs/009695399/basedefs/limits.h.html)。 (在我的Linux机器上,限制是2097152)。

您的示例恰好起作用,因为参数和环境是逼真地存储的,因此附加到字符串将覆盖它后面的内容(跟随参数或环境)。 这就是为什么尝试扩展这样的argv字符串是一个坏主意。如果你想修改它们,可以编辑它们或缩小它们,但试图扩展它们是一种麻烦。

答案 2 :(得分:0)

标准规定argv可以修改,因为它是一个特殊的内部。

177 - 参数argc和argv以及argv数组指向的字符串应该可由程序修改,并在程序启动和程序终止之间保留它们最后存储的值,因此它只分配你需要的值。转让或更换。

标准文字: http://c0x.coding-guidelines.com/5.1.2.2.1.html