关于main函数的命令行参数

时间:2011-09-21 11:23:22

标签: c++ c arguments main

它看起来像int main(int argc, char *argv[]);。我的问题是:

1我可以在argv[]中添加多少个数组项?

2每个char *的最大尺寸是多少?

4 个答案:

答案 0 :(得分:4)

您可以尝试:

$ getconf ARG_MAX
2180000

http://pubs.opengroup.org/onlinepubs/007904975/basedefs/limits.h.html

  

ARG_MAX是exec函数的最大参数长度,包括环境数据。

也就是说,参数数量或参数长度没有个别限制。只存储存储所有参数和环境变量所需的总大小限制。

xargs使用sysconf(_SC_ARG_MAX);计算最大命令行长度,其值与getconf ARG_MAX报告的值相同。

在Linux命令行参数和环境变量被放入新进程的堆栈中。因此,进程/线程最大堆栈大小是最终上限。特定于Linux的限制为hardcoded in the kernel

#define MAX_ARG_STRLEN (PAGE_SIZE * 32)
#define MAX_ARG_STRINGS 0x7FFFFFFF

答案 1 :(得分:3)

这两者都受限于你拥有多少内存(或者你的操作系统为你的程序提供了多少内存)。

编辑:实际上,参数的数量也受int的大小限制。

答案 2 :(得分:0)

我认为你误解了这里发生了什么。在代码中,您没有向argv []添加任何内容,并且您不必担心它们的最大大小。当有人运行你编译的程序时,如

./javas_program argument1 argument2 argument3

然后将调用您的主函数。 argc将为4,argv[0]将为./javas_programargv[1]将为argument1argv[2]将为argument2等。

在你的程序中,你应该假设argv[]的内容可以是任何大小。如果要将它们限制为特定大小,则应检查它们是否大于此值。

答案 3 :(得分:0)

这可能取决于您用于启动程序的机制。如果是通过shell(bash或其他),你必须查看是否有限制。

如果你通过execv或类似的东西开始你的程序,它们应该受到与任何数组和字符串相同的限制,并且正如有人指出的那样,因为argc是{{1} }由于历史原因,int的有限大小不是int