当我们编写一个可以接受命令行参数的C程序时,我们将main函数编写为:
int main(int argc, char **argv) {
. . .
}
我们知道argc
大于等于1
所以,至少存在argv[0]
。
我的问题是argv[0]
和后续参数的分配缓冲区大小是多少,如果有的话,例如argv[1]
,argv[2]
等?
答案 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内核只会将必要的字节复制到程序堆栈中。
然后也无法保证你的编译器不会对参数做一些自己的魔术。