C命令行参数中argv的已分配缓冲区大小

时间:2018-05-31 08:32:56

标签: c command-line-arguments argv argc

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

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

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

3 个答案:

答案 0 :(得分:2)

  

我们知道argc大于等于1

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

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

引用C11,章节§5.1.2.2.1

  
      
  • argc的值应为非负值。
  •   

和,

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

  •   
  • 如果argc的值大于零,则argv[0]指向的字符串   代表程序名称; argv[0][0]如果是,则为空字符   程序名称不能从主机环境中获得。如果argc的值是   大于一,argv[1]通过argv[argc-1]指向的字符串   代表程序参数

  •   

答案 1 :(得分:1)

  

argv[0]和后续参数

的分配缓冲区大小是多少

答案是"至少足够大以包含指向包含空终止符的字符串"。

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

cat /etc/passwd

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

答案 2 :(得分:0)

我认为完整的答案是,如评论所述:它与平台有关。

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

然后也无法保证你的编译器不会对参数做一些自己的魔术。