【问题标题】:Size of allocated buffer for argv in C Command line argumentC命令行参数中为argv分配的缓冲区大小
【发布时间】:2018-11-10 05:03:44
【问题描述】:

当我们编写一个可以接受命令行参数的 C 程序时,我们将 main 函数编写为:

int main(int argc, char **argv) {
. . .
}

我们知道argc 大于等于1 所以,至少存在argv[0]。 我的问题是argv[0] 和后续参数(如果有的话)的分配缓冲区大小是多少? argv[1]argv[2] 等?

【问题讨论】:

  • 我认为这取决于实现(我认为没有定义的标准)。我希望大多数实现分配足够的内存来适应每个字符串(可能使用 strdup)

标签: c command-line-arguments argv argc


【解决方案1】:

我们知道 argc 大于等于 1

嗯,这不是真的。它应该是非负的。也可以是0。

如果存在argv[n],则argv[n] 的大小是您平台中指针的大小。指针指向的内存大小与提供的命令行参数字符串相同(由底层环境提供)。

引用C11,第 5.1.2.2.1 章

  • argc 的值应为非负数。

和,

  • 如果argc的值大于零,则数组成员argv[0]通过 argv[argc-1] inclusive 应包含指向字符串的指针,这些指针是给定的 在程序启动之前由主机环境实现定义的值。这 意图是向程序提供在程序启动之前确定的信息 来自托管环境中的其他地方。 [...]

  • 如果argc的值大于零,则argv[0]指向的字符串 代表程序名称; argv[0][0] 应为空字符,如果 程序名称在主机环境中不可用。如果 argc 的值为 大于一,argv[1]argv[argc-1] 指向的字符串 表示程序参数

【讨论】:

  • 什么时候可以为零?
  • @purec 如果程序名称在主机环境中不可用并且没有程序参数,它将为零。
  • 0 也可以递归调用 main() - 尽管这样的调用通常是有问题的。
【解决方案2】:

argv[0] 和后续参数分配的缓冲区大小是多少

答案是“至少大到足以包含指向的字符串,包括空终止符”。

例如,在典型的 Unix 系统上,使用命令

cat /etc/passwd

argc 为 2,分配给 argv[0] 的缓冲区至少为 4 个字节,分配给argv[1] 的缓冲区至少为 12 个字节。您不能假设有关缓冲区大小或分配方式和位置的任何其他信息。这一切都被main之前运行的前奏代码处理了。

【讨论】:

    【解决方案3】:

    我认为完整的答案是,正如评论中所说:它取决于平台。

    但是通过查看源代码似乎至少 linux 内核只会将必要的字节复制到程序堆栈中。

    那么也不能保证你的编译器不会对参数做一些自己的魔法。

    【讨论】:

      猜你喜欢
      • 2018-11-27
      • 2013-06-14
      • 2011-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-26
      • 2017-04-07
      • 1970-01-01
      相关资源
      最近更新 更多