argv[] 分配了多少内存?

How much memory is allocated for argv[]?

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

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

Linux 只使用在堆栈上存储参数和(初始)环境变量所需的内存;如果您尝试使用比现有内容更多的内容,那么您将覆盖其他内容(或崩溃)。

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

177 — 参数 argc 和 argv 以及 argv 数组指向的字符串应可由程序修改,并在程序启动和程序终止之间保留它们最后存储的值,因此仅分配您需要的内容在分配或替换时。

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

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

getconf ARG_MAX

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

您的示例恰好有效,因为参数和环境实际上是连续存储的,因此附加到字符串将覆盖它后面的内容(跟随参数或环境)。 这就是为什么像这样尝试扩展 argv 字符串是个坏主意。如果你想修改它们,要么编辑它们,要么缩小它们,但试图扩大它们是自找麻烦。