C++ 关于main函数的命令行参数

C++ 关于main函数的命令行参数,c++,c,arguments,main,C++,C,Arguments,Main,它看起来像intmain(intargc,char*argv[])。我的问题是: 1我可以在argv[]中添加多少数组项 2每个char*的最大大小是多少?这两个值都仅取决于您拥有的内存量(或您的操作系统为您的程序提供的内存量) 编辑:实际上,参数的数量也受int的大小限制,我想你误解了这里发生的事情。在代码中,您不需要向argv[]添加任何内容,也不必担心它们的最大大小。当有人运行您的编译程序时,如 ./javas_program argument1 argument2 argument3

它看起来像
intmain(intargc,char*argv[])。我的问题是:

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


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

这两个值都仅取决于您拥有的内存量(或您的操作系统为您的程序提供的内存量)


编辑:实际上,参数的数量也受
int

的大小限制,我想你误解了这里发生的事情。在代码中,您不需要向argv[]添加任何内容,也不必担心它们的最大大小。当有人运行您的编译程序时,如

./javas_program argument1 argument2 argument3
然后将调用您的主函数
argc
将是4,
argv[0]
将是
/javas\u程序
argv[1]
将是
argument1
argv[2]
将是
argument2
,等等


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

这可能取决于启动程序所使用的机制。如果它是通过shell(
bash
或其他什么)执行的,那么您必须查找它是否施加了限制

如果您通过
execv
或类似的方式启动程序,它们应该只受到与任何数组和字符串相同的限制,并且正如有人指出的那样,由于历史原因,
argc
int
,限制为
int
而不是
size\u t

,您可以尝试:

$ getconf ARG_MAX
2180000

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

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

使用sysconf(_SC_ARG_MAX)计算最大命令行长度产生与
getconf ARG_MAX
报告的值相同的值

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


我认为这取决于实现,你不能依赖于任何特定的界限。如果你需要传递太多的参数,以至于你需要考虑这些上限,你可能做错了什么。您可能需要某种形式的IPC,但为什么需要这些信息?如果您需要,可能您做错了什么。1我使用linux 2,我将使用exec()通过PHP脚本向它传递大量信息。3我认为使用file来交换数据比使用main函数的参数要花费更多的时间。thanks@javas:文件不是IPC的唯一形式,例如,您可以使用
popen
并通过管道写入大量数据。但是在linux上,命令行可以很长,以支持诸如
ls*log
之类的东西。或者你的操作系统为cmd行提供了多少内存(这在大多数操作系统中是非常有限的,有时是非常硬编码的),我想这个答案是在回答“任何字符的最大大小是多少”,而提问者,可能是因为误解,我在问argv[]中的
char*
s的最大大小是多少。Windows提供的内存非常少(有时它只占用了几kB的命令行arg),而所有Unix平台都非常慷慨,如果您需要更多,那么您就错了。
#define MAX_ARG_STRLEN (PAGE_SIZE * 32)
#define MAX_ARG_STRINGS 0x7FFFFFFF