我对从命令行向 main() 传递参数的理解是 argc 的最小值为 1,而 argv[0] 将始终包含程序名称及其路径。
如果在命令行中提供了参数,那么 argc 的值将大于 1,而 argv 1 argv[argc-1] 将具有这些参数。
现在是 this link 的一段说
argv[0] will be a string containing the program's name or a null string if that is not available.
现在,argv[0] 如何以及何时可以有空字符串?我的意思是程序名称及其路径将始终可用,所以什么时候可以为空?
作者说“如果那不可用”但是程序名称何时以及如何可能不可用?
最佳答案
使用 exec
调用类,您可以分别指定程序 name 和程序 executable ,这样您就可以将其设置为 NULL。
但这句话实际上来自 ISO 标准(可能是转述的),并且该标准涵盖了从最小的微 Controller 到最新的 z10 企业级大型机的范围极广的执行环境。
许多嵌入式系统都处于可执行名称毫无意义的情况。
来自最新的c1x草案:
The value of
argc
shall be nonnegative.The value
argv[argc]
shall be a null pointer.If the value of
argc
is greater than zero, the array membersargv[0]
throughargv[argc-1]
inclusive shall contain pointers to strings, which are given implementation-defined values by the host environment prior to program start up.
这意味着,如果 argc
为零(并且可以为零),则 argv[0] 为 NULL。
但是,即使 argc
不是 0,您也可能无法获得程序名称,因为标准还规定:
If the value of
argc
is greater than zero, the string pointed to byargv[0]
represents the program name;argv[0][0]
shall be the null character if the program name is not available from the host environment. If the value ofargc
is greater than one, the strings pointed to byargv[1]
throughargv[argc-1]
represent the program parameters.
因此,标准没有要求提供程序名称。我见过程序为此值使用多种选项:
- 完全没有值(value)(为了假定的安全性)。
- 一个公然的谎言(例如对一段恶意代码的
sleep
)。 - 实际的程序名称(例如
sleep
)。 - 稍作修改(例如用于登录 shell 的
-ksh
)。 - 描述性名称(例如,
progname - a program for something
)。
关于c - argv[0] 什么时候可以为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2794150/