linux 为argv[]分配多少内存?[duplicate]

bn31dyow  于 2023-02-11  发布在  Linux
关注(0)|答案(3)|浏览(171)
    • 此问题在此处已有答案**:

where command line arguments are stored?(4个答案)
六年前关闭了。
我知道命令行参数是字符数组,它们存储在堆栈中。但是,我想知道每个参数的实际内存分配。例如,假设我将目录名"/tmp"作为命令行参数传递。这将存储在argv[1]中。但是,正如我测试的那样,在程序中允许将argv[1]更改为"/tmp/log/"(大小增加),这是如何实现的?

7eumitmz

7eumitmz1#

为了回答您的问题,参数字符串和传递的环境可用的总最大大小可以通过以下方式获得:

getconf ARG_MAX

从命令行或从C中调用syconf等效项(有关更多信息,请参见http://pubs.opengroup.org/onlinepubs/009695399/basedefs/limits.h.html)。(在我的Linux机器上,限制是2097152)。
你的例子恰好可以工作,因为参数和环境实际上是连续存储的,所以追加字符串会覆盖它后面的内容(参数之后,或者环境之后),这就是为什么像这样尝试扩展argv字符串是个坏主意。如果你想修改它们,要么编辑它们,要么缩小它们,但是试图扩展它们是一个麻烦。

axr492tv

axr492tv2#

在Linux上,参数由create_elf_tables填充,至少对于这个特定的平台来说,值存储在堆栈上是正确的。
Linux只使用在堆栈上存储参数和(初始)环境变量所需的内存;如果您尝试使用比已有内容更多的内容,您将覆盖其他内容(或崩溃)。

nafvub8i

nafvub8i3#

标准规定argv可以修改,因为它是一个特殊的内部变量。
177 -参数argc和argv以及argv数组指向的字符串应该可以被程序修改,并且在程序启动和程序终止之间保留它们最后存储的值,所以它只分配你在赋值或替换时需要的值。
标准文本:http://c0x.coding-guidelines.com/5.1.2.2.1.html

相关问题